ServerSocket选项的基本解析:SO_TIMEOUT选项、SO_REUSEADDR选项、SO_RCVBUF选项

来源:互联网 发布:新后缀域名 编辑:程序博客网 时间:2024/05/22 18:27

1:SO_TIMEOUT选项

      此选项表示等待客户连接的超时时间

设置该选项:public void setSoTimeOut(int timeout) throws SocketException

读取该选项:public int getSoTimeOut() throws IOException;

    测试程序:

import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class TimeoutTest {public static void main(String[] args) {try {ServerSocket serverSocket = new ServerSocket(8000);serverSocket.setSoTimeout(6000);                  //等待客户连接的时间不超过6秒Socket socket = serverSocket.accept();socket.close();System.out.println("服务器关闭");} catch (IOException e) {e.printStackTrace();}}}


因为程序中设置了超时时间为6秒,那么当服务器等待的时间超过了超时时间,就会抛出SocketTimeOutException,它是InterruptedException的子类

如果把serverSocket.setSoTimeOut(6000)去掉,那么服务器端会一直等待下去,直到接收到了客户的连接,才会从accept()方法返回

2:SO_REUSEADDR选项

     该选项表示是否允许重用服务器所绑定的地址

    设置该选项:public void setReuseAddress(boolean on) throws SocketException

    读取该选项:public boolean getReuseAddress() throws SocketException

   该选项用来决定如果网络上仍然有数据向旧的ServerSocket传输数据,是否允许新的ServerSocket绑定到与旧的ServerSocket同样的端口上,该选项的默认值与操作系统有关,在某些操作系统中,允许重用端口,而在某些系统中不允许重用端口。

   当ServerSocket关闭时,如果网络上还有发送到这个serversocket上的数据,这个ServerSocket不会立即释放本地端口,而是等待一段时间,确保接收到了网络上发送过来的延迟数据,然后再释放端口

     值得注意的是,public void setReuseAddress(boolean on) throws SocketException必须在ServerSocket还没有绑定到一个本地端口之前使用,否则执行该方法无效。此外,两个公用同一个端口的进程必须都调用serverSocket.setReuseAddress(true)方法,才能使得一个进程关闭ServerSocket之后,另一个进程的ServerSocket还能够立刻重用相同的端口

 

3:SO_RCVBUF选项

表示接收数据的缓冲区的大小,无论在ServerSocket绑定本地端口之前还是之后,调用setReceiveBufferSize()方法都有效。

设置该选项:public void setReceiveBufferSize(int size) throws SocketException

读取该选项:public int getReceiveBufferSize() throws SocketException

import java.io.IOException;
import java.net.ServerSocket;

public class RecvBufferSizeTest {

 public static void main(String[] args) {
  
  try {
   ServerSocket serverSocket = new ServerSocket(8000);
   int size = serverSocket.getReceiveBufferSize();
   System.out.println("before modify size:" + size);
   if(size < 130172) {
    serverSocket.setReceiveBufferSize(130172);                //把缓冲区的大小设置为128KB
   }
   System.out.println("after modify:" + serverSocket.getReceiveBufferSize());
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

原创粉丝点击