如何设置 Socket 连接的超时时间?

在Socket编程中,可以通过以下方式设置连接的超时时间:
1、 为Socket对象设置超时时间:

  • 使用socket.setSoTimeout(int)设置以毫秒为单位的超时时间。
  • 超时后会抛出SocketTimeoutException。
Socket socket = new Socket("127.0.0.1", 8000);
socket.setSoTimeout(1000);   // 设置1s超时时间

try {
    InputStream in = socket.getInputStream();
    byte[] buffer = new byte[1024];
    in.read(buffer);   // 如果在1s内未读取到字节,会超时
} catch (SocketTimeoutException e) {
    e.printStackTrace();
}

2、 为ServerSocket对象设置超时时间:

  • 使用serverSocket.setSoTimeout(int)设置以毫秒为单位的超时时间。
  • 超时后accept()方法会抛出SocketTimeoutException。
ServerSocket server = new ServerSocket(8000);
server.setSoTimeout(1000);   // 设置1s超时时间

try {
    Socket socket = server.accept();   // 如果在1s内没有客户端连接,会超时  
} catch (SocketTimeoutException e) {
    e.printStackTrace();
}

3、 为DatagramSocket对象设置超时时间:

  • 使用socket.setSoTimeout(int)设置以毫秒为单位的超时时间。
  • 超时后receive()方法会抛出SocketTimeoutException。
DatagramSocket socket = new DatagramSocket(8000);
socket.setSoTimeout(1000);    // 设置1s超时时间

try {
    byte[] buffer = new byte[1024];
    DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
    socket.receive(packet);   // 如果在1s内没有数据报到达,会超时
} catch (SocketTimeoutException e) {
    e.printStackTrace(); 
}

总之,通过设置超时时间,可以使网络程序具有更高的健壮性。如果在规定时间内未能完成网络操作,程序不会无限期地阻塞等待,而是抛出异常,供应用层程序员作出相应处理。