Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用socket.setSoTimeout()?_Java_Sockets - Fatal编程技术网

Java 如何使用socket.setSoTimeout()?

Java 如何使用socket.setSoTimeout()?,java,sockets,Java,Sockets,使用socket.seSoTimeout(5000)在套接字上设置超时时套接字是关闭还是在超时后停止侦听?我必须再次打开插座才能继续收听,还是它会自动打开 receivingSocket.setSoTimeout(5000); // set timer try{ receivingSocket.receive(packet); } catch(SocketTimeoutException e){ System.out.println("### Timed out after 5 seco

使用
socket.seSoTimeout(5000)在套接字上设置超时时套接字是关闭还是在超时后停止侦听?我必须再次打开插座才能继续收听,还是它会自动打开

receivingSocket.setSoTimeout(5000); // set timer
try{
  receivingSocket.receive(packet);
}
catch(SocketTimeoutException e){
  System.out.println("### Timed out after 5 seconds.");
}
//will I have to reopen the socket here?

您可以通过将try/catch包装在
while(true)
中来测试您的问题。简短的回答是否,您不必重新打开套接字。
setSoTimeout()
只是告诉套接字在您尝试执行任何其他操作之前等待数据这么长时间

byte[] buffer = new byte[1000];
DatagramPacket p = new DatagramPacket(buffer, buffer.length);
DatagramSocket receiveSocket = new DatagramSocket(5505, InetAddress.getByName("127.0.0.1"));
receiveSocket.setSoTimeout(5000);
while (true) {
    try {
        receiveSocket.receive(p);
    } catch (SocketTimeoutException ste) {
        System.out.println("### Timed out after 5 seconds");
    }
}
结果(您可以看到套接字超时后仍然可以重用):

如州政府所述:

如果超时过期,将引发java.net.SocketTimeoutException,尽管ServerSocket仍然有效


所以不,它不会关闭插座。下次当你想知道一些东西是如何工作的时候,请查看文档

好的,哇,谢谢。没想到这么简单。我想我是想得太多了。本质上,它在等待“receivesocket.receive(p);”去拿包。现在说得通了,那是错误的。问题不在于
ServerSockets