疯狂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例外。

  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参数才生效。