0

通过一些关于套接字的教程,我不断遇到这样的代码:

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

问题是:这个循环是怎么留下的?仅通过捕获,一旦接收()完成?

更准确地说,这是我所做的:

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();
        }
    }

但是我一直想出一个超时异常,尽管读取是正确的。所以我想知道,如果例外是“预期”的离开方式。尽管我严重怀疑...并且 socket.receive(packet) 是抛出异常的地方。

4

5 回答 5

4

信不信由你,您不希望所有循环都终止。

一个典型的例子是一个 web 服务器,它有一个简单的循环来监听请求,处理请求,然后再次返回等待 - “永远”。这基本上就是您的代码示例。

答案是“没有留下这个循环”,这就是你想要的。

于 2012-08-07T12:52:09.197 回答
0

循环永远不会离开,这是服务器保持正常运行的全部目的。

还是您希望服务器接收一个客户端调用然后关闭?

于 2012-08-07T12:52:49.633 回答
0

除非内部发生错误,否则循环永远不会中断。

于 2012-08-07T12:53:23.300 回答
0

这两个代码块暗示了一种非常不同的功能意义。

第一个似乎在说,“我希望我的请求处理程序无限期地运行,直到我自己手动退出程序!” 这是一个合理的说法。

但是第二个代码块完全不同。你进入了循环,但永远不会超过一次,因为要么isMyIdentifier(resultString)是真的,在这种情况下你会退出方法(当然还有循环),或者不是在这种情况下你仍然退出方法. 在这种情况下,循环根本没有做任何事情。

此外,是的,异常处理为您的第二个代码块提供了另一种退出循环的方法。至于为什么抛出异常,那是另一个问题。

于 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 回答