如何使用socket.setSoTimeout()?

使用socket.seSoTimeout(5000);在套接字上设置超时时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)来测试您的问题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仍然有效

所以不,它不会关闭套接字。 下次当您想知道某些工作原理时,请查看文档