2

私は現在、最初のクライアント>サーバー システムをコーディングして、文字列を含むパケットをネットワーク経由で前後に送信しようとしています。ただし、次のことが起こっているという問題があります。クライアントがサーバーにメッセージを送信し、サーバーがメッセージを受信し、メッセージを処理し、クライアントに返信を送信すると思われますが、クライアントはこのメッセージを受信せず、サーバーからの応答を待ってハングします。コードは次のとおりです。

サーバ:

public static void handlePackets() throws Exception {
    String clientSentence;
    String returnToClient;
    ServerSocket welcomeSocket = new ServerSocket(1337);

         System.out.println("Packet receiver initialized!");
         while (run) {
            Socket connectionSocket = welcomeSocket.accept();
            BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
            DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
            clientSentence = inFromClient.readLine();
            System.out.println("Received Packet: " + clientSentence);


            System.out.println("Compiling return to client.");
            returnToClient = "";
            if (clientSentence.startsWith("Handshake-")) {
                returnToClient = handleHandShake(clientSentence);
            }

            outToClient.writeBytes(returnToClient);
            System.out.println("Sent client response " + returnToClient);
         }
         welcomeSocket.close();
  }

クライアント:

public static String sendTCP(String host, String content) {
    try {
        System.out.println("Packet sender sending TCP packet " + content);
        String serverResponse;
        Socket clientSocket = new Socket(host, 1337);
        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        outToServer.writeBytes(content + '\n');

        System.out.println("Send data to sever. Awaiting response.");

        serverResponse = inFromServer.readLine();
        clientSocket.close();

        System.out.println("Server response received " + serverResponse + " result was returned to caller.");

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


    return "";
}
4

2 に答える 2

3

クライアントは呼び出しreadLine()ていますが、サーバーは行を書き込んでおらず、バイトだけを書き込んでいるため、クライアントは行末記号を永遠に待っています。サーバーの応答に「\n」を追加します。また、サーバーは、受け入れたソケットの処理が終了したら、そのソケットを閉じる必要があります。これを行うには、ソケット自体を閉じるのではなく、ラップしたライターまたは出力ストリームを閉じます。

BufferedOutputStreamの代わりに使用する必要がありDataOutputStreamます。単純なデータはそのままで機能しますが、遅かれ早かれ修正しないと、文字セットの問題が発生する可能性があります。一般に、対称的な入力ストリームと出力ストリームまたはリーダーを常に使用する必要があります。

于 2013-02-04T04:50:00.433 に答える
0

1) outToServer / outToClient を閉じるかフラッシュする必要があります

2) BufferedReader で読み取るときは、DataOutputStream ではなく BufferedWriter で書き込む必要があります。

于 2013-02-04T04:29:15.730 に答える