通过一些关于套接字的教程,我不断遇到这样的代码:
while(true){
socket.receive(packet);
String message = new String(packet.getData(),0,packet.getLength(), TEXT_ENCODING);
System.out.println(message);
}
问题是:这个循环是怎么回事?只有通过catch,一旦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();
}
}
但我一直想出一个时间感,尽管读数是正确的。所以我想知道,如果例外是'预期'的方式离开。虽然我严重怀疑......并且socket.receive(数据包)是,抛出异常的地方。
答案 0 :(得分:4)
信不信由你,你不希望所有循环终止。
一个典型的例子是一个Web服务器,它有一个简单的循环来监听请求,处理请求,然后再回到等待 - “永远”。这基本上就是你的代码示例。
答案是“这个循环没有留下”,这就是你想要的。
答案 1 :(得分:0)
永远不会留下循环,这是服务器熬夜的全部目的。
或者您希望服务器接收一个客户端呼叫,然后关闭?
答案 2 :(得分:0)
除非在。内发生错误,否则循环永远不会被打破。
答案 3 :(得分:0)
这两个代码块意味着非常不同的功能感。
第一个似乎在说,“我希望我的请求处理程序无限期地运行,直到我自己手动退出程序!”这是合理的说法。
但第二块代码却截然不同。你进入循环,但永远不会绕过它多次因为isMyIdentifier(resultString)
为真,在这种情况下你退出方法(当然是循环),或者不是你在哪种情况下< em>仍然退出该方法。在这种情况下,循环根本没有做任何事情。
此外,是的,异常处理为您的第二个代码块提供了另一种退出循环的方法。至于为什么它会抛出异常,这是另一个问题。
答案 4 :(得分:0)
在下面的代码中有一个连续 while loop
,这似乎是一个合适的实现,但有些服务器倾向于继续倾听,并处理请求同时进行。
此while循环永远不会退出!
while(true){
socket.receive(packet);
String message = new String(packet.getData(),0,packet.getLength(), TEXT_ENCODING);
System.out.println(message);
}