你的位置:首页 > Java教程

[Java教程]java serversocket参数详解


ServerSocket有以下3个选项。

SO_TIMEOUT:表示等待客户连接的超时时间。
SO_REUSEADDR:表示是否允许重用服务器所绑定的地址。
SO_RCVBUF:表示接收数据的缓冲区的大小。

 

SO_TIMEOUT :  表示接收数据时的等待超时时间 。 单位为毫秒,默认值为0 , 表示永远等待。

设置该选项:public void setSoTimeOut(int timeout) throws SocketException
读取该选项:public int getSoTimeOut() throws IOException;

 

SO_TIMEOUT表示ServerSocket的accept()方法等待客户连接的超时时间,以毫秒为单位。如果SO_TIMEOUT的值为0,表示永远不会超时,这是SO_TIMEOUT的默认值。

当服务器执行ServerSocket的accept()方法时,如果连接请求队列为空,服务器就会一直等待,直到接收到了客户连接才从accept()方法返回。如果设定了超时时间,那么当服务器等待的时间超过了超时时间,就会抛出SocketTimeoutException,它是InterruptedException的子类。

当底层的Socket实现不支持SO_TIMEOUT选项时,这两个方法将抛出SocketException例外。不能将timeout设为负数,否则setSoTimeout方法将抛出IllegalArgumentException例外。

实例参见:http://blog.csdn.net/woshisap/article/details/6597413

 

SO_RESUSEADDR:  表示是否允许重用socket所绑定的本地地址

设置该选项: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还能够立刻重用相同的端口。

 

SO_RCVBUF:  接收数据的缓冲区大小

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

SO_RCVBUF 表示 Socket 的用于输入数据的缓冲区的大小. 一般说来, 传输大的连续的数据块(基于HTTP 或 FTP 协议的通信) 可以使用较大的缓冲区, 这可以减少传输数据的次数, 提高传输数据的效率. 而对于交互频繁且单次传送数据量比较小的通信方式(Telnet 和 网络游戏), 则应该采用小的缓冲区, 确保小批量的数据能及时发送给对方. 这种设定缓冲区大小的原则也同样适用于 Socket 的 SO_SNDBUF 选项.

      如果底层 Socket 不支持 SO_RCVBUF 选项, 那么 setReceiveBufferSize() 方法会抛出 SocketException.

 

backlog : 输入连接指示(对连接的请求)的最大队列长度被设置为 backlog 参数。如果队列满时收到连接指示,则拒绝该连接。

 

1. backlog参数必须是大于 0 的正值。如果传递的值等于或小于 0,则假定为默认值。  
2. 经过测试这个队列是按照FIFO(先进先出)的原则。 
3. 如果将accept这个函数放在一个循环体中时,backlog参数也不会有什么作用。或者简单的讲运行ServerSocket的这个线程会阻塞时,无论是在accept,还是在read处阻塞,这个backlog参数才生效。

实例参考:http://blog.csdn.net/huang_xw/article/details/7338487