0

ポート 19132 で受信パケットをリッスンし、受信したパケットを出力したいのですが、これまでのところ、私のコードではまったく何も出力されません。ポート 19132 を介してパケットをコンピューターに転送するサーバーがあり、ポートが開いて有効になっていますが、まだ何も出力されません。

public static void listenToPort(){
    try{
        ServerSocket serverSocket = new ServerSocket(19132);
        Socket socket = serverSocket.accept();
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        while(true){
            try{
                System.out.println(in.readLine());
            }
            catch(IOException e){
                System.out.println("Connection to server lost!");
                System.exit(1);
                break;
            }
        }
    }
    catch(IOException e){
        System.out.println(e.getMessage());
    }
}

サーバー側では情報が送信されていますが、クライアント プログラム (このスクリプト) は何も受信していません。何が問題なのですか?

4

2 に答える 2

2

「パケット」ではなく、行を読んでいます。このポートに送信されるデータに改行が含まれていない場合、readLine()永久にブロックされるか、ピアが接続を閉じるまでブロックされます。

一方、何かを読み取る場合、または EOS の場合、 nullnullを返すかどうかをチェックしていないため、コードは永久に印刷をスピンreadLine()し、その時点でソケットを閉じてループを終了する必要があります。

于 2012-07-06T02:28:35.517 に答える
1

言うまでもなく、System.exit がコンソールの出力をフラッシュするのに十分な時間を与えない可能性は十分にあります (System.exit が System.exit でフラッシュを引き起こすかどうかは 100% 確信が持てません)。 out および System.err)。

サーバー プロセスにデバッガを接続して、in.readLine() を通過するかどうかを確認してみませんか? 他のポスターの 1 つが言及したように、改行文字を送信していない場合、送信するまで in.readLine() はブロックされます。

第二に、実際には System.exit を使用しないでください。ほとんどの場合、これは悪い形であり、なぜアプリがランダムに終了するのか不思議に思う人がいます. アプリを終了する場合は、コードが main() メソッドに戻れるようにする必要があります。必要に応じて、そこから System.exit を実行できます。

于 2012-07-06T02:33:48.453 に答える