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

1:SO_TIMEOUT选项

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

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

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

    测试程序:

[java]  view plain copy
  1. import java.io.IOException;  
  2. import java.net.ServerSocket;  
  3. import java.net.Socket;  
  4.   
  5. public class TimeoutTest {  
  6.   
  7.     public static void main(String[] args) {  
  8.         try {  
  9.             ServerSocket serverSocket = new ServerSocket(8000);  
  10.             serverSocket.setSoTimeout(6000);                  //等待客户连接的时间不超过6秒  
  11.             Socket socket = serverSocket.accept();  
  12.             socket.close();  
  13.             System.out.println("服务器关闭");  
  14.               
  15.         } catch (IOException e) {  
  16.             e.printStackTrace();  
  17.         }  
  18.     }  
  19. }  


因为程序中设置了超时时间为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();
  }
 }

}

ServerSocket的几个方法

   *isClosed():判断serverSocket是否已经被关闭,只有执行了ServerSocket的close方法,isClosed()方法才返回true,否则,即使ServerSocket还没有和特定的端口绑定,isClosed方法也会返回false

   *isBound():判断ServerSocket方法是否已经与一个端口绑定,只要ServerSocket已经和一个端口绑定,即使它已经被关闭,isBound()也会返回true

    *如果需要判断一个ServerSocket已经与特定端口绑定,并且还没有被关闭,则可以采用下列方式:

        boolean isOpen = serverSocket.isBound() && !serverSocket.isClosed()


你可能感兴趣的:(socket,服务器)