1:SO_TIMEOUT选项
此选项表示等待客户连接的超时时间
设置该选项:public void setSoTimeOut(int timeout) throws SocketException
读取该选项:public int getSoTimeOut() throws IOException;
测试程序:
因为程序中设置了超时时间为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()