0

ソケットに関するいくつかのチュートリアルを行っていると、次のようなコードに出くわします。

  while(true){ 
    socket.receive(packet); 
    String message = new String(packet.getData(),0,packet.getLength(), TEXT_ENCODING); 
    System.out.println(message); 
  }  

質問: このループはどのように残されていますか? receive() が完了したら、キャッチを介してのみ?

より正確に言うと、私がやったことは次のとおりです。

while(true) {
        try {
            socket.receive(answer);
            resultString = new String(answer.getData(), 0, answer.getLength(), "ASCII");

            if (isMyIdentifier(resultString)) {
                gatewayIP =  answer.getAddress().getHostAddress();
                return true;
            } else {
                return false;
            }
        }
        catch (SocketTimeoutException e) {
            throw new GatewayNotReachableException();
        }
    }

しかし、読み取りは正しいのですが、timeoutexception が発生し続けます。だから私は、例外が「予想される」出発方法であるかどうか疑問に思っていました。私はそれを真剣に疑っていますが...そして、socket.receive(packet)は、例外がスローされる場所です。

4

5 に答える 5

4

信じられないかもしれませんが、すべてのループを終了させたくはありません。

古典的な例の1つは、要求をリッスンし、要求を処理してから、再び待機に戻る(「永久に」)単純なループを持つWebサーバーです。それが基本的にあなたのコード例です。

答えは「このループは残されていない」であり、それがあなたが望むものです。

于 2012-08-07T12:52:09.197 に答える
0

ループが終了することはありません。これがサーバーの稼働状態を維持する目的です。

または、サーバーが1つのクライアント呼び出しを受信して​​からシャットダウンするようにしますか?

于 2012-08-07T12:52:49.633 に答える
0

内でエラーが発生しない限り、ループが中断されることはありません。

于 2012-08-07T12:53:23.300 に答える
0

Those two blocks of code imply a very different sense of functionality.

The first one seems to say, "I want my request handler to run indefinitely, until I manually quit the program myself!" Which is a reasonable thing to say.

しかし、コードの 2 番目のブロックはまったく異なります。ループに入りますが、2 回以上ループすることはありません。どちらかisMyIdentifier(resultString)が true の場合はメソッド (そしてもちろんループ) から戻るか、そうでない場合はメソッドを終了します。 . その場合、ループはまったく何もしていません。

さらに、はい、例外処理は、コードの 2 番目のブロックがループを終了する別の方法を提供します。なぜ例外がスローされるのかについては、別の問題です。

于 2012-08-07T13:00:20.360 に答える
0

以下のコードには継続的ながあり、これは適切な実装に見えるかもしれませんが、一部のサーバーは をリッスンし続け、リクエストを同時に処理while loopする傾向があります。

この while ループは終了しません。

while(true){ 
    socket.receive(packet); 
    String message = new String(packet.getData(),0,packet.getLength(), TEXT_ENCODING); 
    System.out.println(message); 
  } 
于 2012-08-07T13:00:42.783 に答える