0

私はこのエラーを何日も修正しようとしています。本当に。わからない。コードは十分に単純です..なぜそれが機能しないのですか?

    public class server
    {
public static void main(String[] args)
{
    String fileName = null;

    try
    {
        ServerSocket ss = new ServerSocket(9999, 3);

        Socket dataSocket = ss.accept();
        System.out.println("Server: Connection Established");

        InputStream is = dataSocket.getInputStream();
        //BufferedReader br = new BufferedReader(new InputStreamReader(is));
        Scanner sc = new Scanner(dataSocket.getInputStream());

        while(sc.hasNextByte())
        {
            System.out.println("True");
            fileName = fileName+sc.next();
        }

        FileWriter fw = new FileWriter("server"+fileName);
        while(dataSocket  != null)
        {
            fw.write(is.read());
        }

        fw.flush();
        dataSocket.close();
        ss.close();
            /*String[] nameParts;
            nameParts = fileName.split(".");
            File f = new File(nameParts[0]+"."+nameParts[1]);
            FileOutputStream fos = new FileOutputStream(f);
            System.out.println(nameParts[0]);*/
    }

    catch(Exception e)
    {
        e.printStackTrace();
    }
}

    }

上記はサーバーコードです。クライアントコードは以下のとおりです。

    public class client 
    {
public static void main(String[] args) 
{
    // Read a file
    try 
    {
        Socket dataSocket = new Socket();

        dataSocket.connect(new InetSocketAddress(InetAddress.getLocalHost(), 9999));
        System.out.println("Client: Connection Established");

        OutputStream os = dataSocket.getOutputStream();
        PrintWriter pw = new PrintWriter(os);

        String fileName = "text.txt";

        pw.write(fileName);


        File f = new File(fileName);
        Scanner sc = new Scanner(f);

        /*while(sc.hasNextInt())
        {
            pw.write(sc.nextInt());
        }*/

        //pw.flush();
        //pw.close();

        //dataSocket.close();

        /*String[] nameParts = new String[2];
        nameParts = args[0].split(".");

        while(sc.hasNextByte())
        {
            os.write(sc.nextByte());5
        }*/
    }

    catch (Exception e) 
    {
        e.printStackTrace();
    }
}

    }

最初は、クライアントとサーバーの両方が、2人の恥ずかしがり屋のティーンエイジャーのように、お互いが話すのを待ち続けていました。いくつかの変更の後、これが起こり始めました。接続リセットエラーが発生します。助けてください。締め切り!

4

2 に答える 2

2

sc.hasNextByte()ピアが接続を閉じるまで true のままです。したがって、このループから抜け出すことはできません。ファイル名の前にファイル名の長さを送信する必要があるため、受信データのどれだけがファイル名であるかがわかります。次に、ファイル名を読み取り、ファイルを開き、残りのストリームを読み取り、EOS までコピーします。

于 2012-04-24T04:27:39.307 に答える
0

必要に応じて、次のようにリーエンを使用してファイル名を書くことができます。

pw.write(ファイル名 + "\n");

または、いくつかのライターを writeLine(fileName ) に使用します。

サーバー側では、 bufferedReader を使用して行ごとに読み取ります。

while ((line = br.readLine()) != null) {

....

}

クライアントが閉じている場合は、ループを終了できます。

于 2012-04-24T05:04:47.580 に答える