0

サーバーが複数のクライアントから送信されたデータを印刷する簡単なプログラムを作成しました。ただし、サーバーは部分的なデータしか受信しません。以下は、コードの関連部分です。

サーバ:

try {
        serverSocket = new ServerSocket(8888);
    } catch (IOException e) {
        System.err.println("Could not listen on port: 8888");
        System.exit(-1);
    }
 while (listening) {
    Socket clientSocket = serverSocket.accept();
    BufferedReader reader = new BufferedReader(new InputStreamReader(
                            clientSocket.getInputStream()));
        System.out.println(reader.readLine());

        reader.close();
        clientSocket.close();
  }
  serverSocket.close();

クライアント:

  try {
        socket = new Socket("nimbus", 8888);
        writer = new PrintWriter(socket.getOutputStream(), true);
        localHost = InetAddress.getLocalHost();
    } 
    catch (UnknownHostException e) {} 
    catch (IOException e) {}

    StringBuilder msg1 = new StringBuilder("A: ");
    for(int i=1; i<=3; i++)
        msg1.append(i).append(' ');
    writer.println(localHost.getHostName() + " - " + msg1);

    StringBuilder msg2 = new StringBuilder("B: ");
    for(int i=4; i<=6; i++)
        msg2.append(i).append(' ');
    writer.println(localHost.getHostName() + " - " + msg2);

    StringBuilder msg3 = new StringBuilder("C: ");
    for(int i=7; i<=9; i++)
        msg3.append(i).append(' ');
    writer.println(localHost.getHostName() + " - " + msg3);

    writer.close();
    socket.close();

次の出力が得られます(3つのクライアントで実行した場合)

nimbus2 - A: 1 2 3 
nimbus3 - A: 1 2 3 
nimbus4 - A: 1 2 3

2番目と3番目のメッセージが表示されません。サーバーは待機し続けます。どこが間違っているのですか?

編集:サーバーコードで、とを削除reader.close()してみclientSocket.close()ました。それもうまくいきませんでした。別の質問-3つのクライアントが3つのメッセージを送信する場合、9つの接続が必要ですか?(これが理由です、私はサーバーコードで接続を閉じました)

4

3 に答える 3

1

おそらく、ソケットの処理を別のスレッドに委任する必要があります。すべての入力を読み取ることができるように、各着信ソケットをエグゼキューターに渡すことで機能する例を作成しました。Executors.newCachedThreadPool()を使用します。これは、必要なだけ大きくなるはずです。一度に1つのクライアントのみを処理できるようにする場合は、Executors.newFixedThreadPool(1)を使用することもできます。

私が行った他の唯一の変更は、BufferedReaderを削除し、スキャナーに置き換えたことです。BufferedReaderがデータを返さないという問題がありました。理由はわかりません。

Executor exe = Executors.newCachedThreadPool();
ServerSocket serverSocket = null;
try {
    serverSocket = new ServerSocket(8888);
} catch (IOException e) {
    System.err.println("Could not listen on port: 8888");
    System.exit(-1);
}
while (listening) {
    final Socket clientSocket = serverSocket.accept();

    exe.execute(new Runnable() {

        @Override
        public void run() {
            try {
                Scanner reader = new Scanner(clientSocket.getInputStream());
                while(reader.hasNextLine()){
                    String line = reader.nextLine();
                    System.out.println(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                clientSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });

}
serverSocket.close();
于 2012-01-08T17:22:21.303 に答える
0

クライアントが書き込みを完了する前、またはサーバーが送信したすべてのメッセージを読み取る前に、クライアントへの接続を閉じたようです。私はあなたがreadlineを続ける必要があると思います、そして潜在的に彼らがあなたに1つのメッセージを送った後にクライアントの接続を終わらせないでください。

于 2012-01-08T16:16:44.753 に答える
0

ジョンは正しい。メッセージを読んだ後、clientsocket.close()を呼び出してクライアント接続を閉じるため、他のメッセージを取得できません。すべてのメッセージを受信したら、clientsocket.close()を呼び出す必要があります

于 2012-01-08T16:38:43.227 に答える