你的位置:首页 > Java教程

[Java教程]java socket参数详解


TCP_NODELAY:  表示立即发送数据

设置该选项: public void setTcpNoDelay(boolean on) throw SocketExpcetion
读取该选项: public boolean getTcpNoDelay(boolean on) throw SocketExpcetion

默认情况下,发送数据时采用Negale算法,Negale算法是指发送方发送数据的时候不会立刻发出,而是先放在缓冲区内,等待缓冲区满了再发送。发送完一批数据后,会等待接受方队这批数据的回应,然后再发送下一批数据。Negal算法适合发送方需要发送大批量数据,并且接收方会及时作出回应的场合,这种算法通过减少传输数据的次数来提高通信的效率。

        如果发送方持续的发送小批量的数据,并且接收方不一定会立即发送相应数据,那么Negale算法会使发送方运行很慢。对已gui重新,如网络游戏程序(服务器需要实时跟踪客户端的鼠标移动),这个问题尤为突出。客户端鼠标位置的改动的信息需要实时发送到服务器端,由于Negale算法采用缓冲,大大降低了实时响应的速度,导致客户端程序很慢。

      TCP_NODEALY 的默认值时 FALSE,采用Negale算法,如果设置为 true,就好关闭socket的缓冲,确保数据及时发送出去。

  如果socket的底层不知道 tcp_nodelay 选项,那么调用 getTcpNoDelay 和 setTcpNoDelay方法会抛出SocketException

 

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_TIMEOUT :  表示接收数据时的等待超时时间 。 单位为毫秒,默认值为0 , 表示永远等待。

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

 

设置socket调用InputStream读数据的超时时间,以毫秒为单位,如果超过这个时候,会抛出java.net.SocketTimeoutException。 
当输入流的read方法被阻塞时,如果设置timeout(timeout的单位是毫秒),那么系统在等待了timeout毫秒后会抛出一个InterruptedIOException例外。在抛出例外后,输入流并未关闭,你可以继续通过read方法读取数据。 
当底层的Socket实现不支持SO_TIMEOUT选项时,这两个方法将抛出SocketException例外。不能将timeout设为负数,否则setSoTimeout方法将抛出IllegalArgumentException例外。

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

 

SO_LINGER:  表示当执行 socket的close方法的时候,是否立即关闭底层的socket 。 这个单位是秒。

设置该选项: public void setSoLinger(boolean on, int seconds) throws SocketException;
读取该选项:public int getSoLinger() throws SocketException

 

SO_LINGER选项用来控制Socket关闭时的行为,默认情况下,执行Socket的close方法,该方法会立即返回,但底层的Socket实际上并不会立即关闭,他会立即延迟一段时间,知道发送完剩余的数据,才会真正的关闭Socket,断开连接。

    setSoLinger(true, 0): 执行该方法,那么执行Socket的close方法,该方法也会立即返回,但底层的Socket也会立即关闭,所有未发送完的剩余数据被丢弃

    setSoLinger(true, 3600): 那么执行Socket的close方法,该方法不会立即返回,而进入阻塞状态,同时,底层的Socket也会尝试发送剩余的数据,只有满足下面的两个条件之一,close方法才会返回:

    (1):底层的Socket已经发送完所有的剩余数据

    (2): 尽管底层的Socket还没有发送完所有的剩余数据,但已经阻塞了3600秒,close()方法的阻塞时间超过3600秒,也会返回,剩余未发送的数据被丢弃。

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

 

SO_SNFBUF:  发送数据的缓冲区大小

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

SO_SNDBUF 表示 Socket 的用于输出数据的缓冲区的大小. 如果底层 Socket 不支持 SO_SNDBUF 选项, setSendBufferSize() 方法会抛出 SocketException.

对于Socket和SeverSocket如果需要指定缓冲区大小,必须在连接之前完成缓冲区的设定。

 

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.

 

SO_KEEPLIVE:  表示对于长时间处于空闲状态的socket,是否要自动把他关闭

设置该选项: public void setKeepAlive(boolean on) throws SocketException
读取该选项: public boolean getKeepAlive() throws SocketException

当 SO_KEEPALIVE 选项为 true 时, 表示底层的TCP 实现会监视该连接是否有效. 当连接处于空闲状态(连接的两端没有互相传送数据) 超过了 2 小时时, 本地的TCP 实现会发送一个数据包给远程的 Socket. 如果远程Socket 没有发回响应, TCP实现就会持续尝试 11 分钟, 直到接收到响应为止. 如果在 12 分钟内未收到响应, TCP 实现就会自动关闭本地Socket, 断开连接. 在不同的网络平台上, TCP实现尝试与远程Socket 对话的时限有所差别.

      SO_KEEPALIVE 选项的默认值为 false, 表示TCP 不会监视连接是否有效, 不活动的客户端可能会永远存在下去, 而不会注意到服务器已经崩溃.

 

OOBINLINE: 表示是否支持发送一个字节的tcp紧急数据

设置该选项: public void setOOBInline(boolean on) throws SocketException
读取该选项: public boolean getOOBInline() throws SocketException

当 OOBINLINE 为 true 时, 表示支持发送一个字节的 TCP 紧急数据. Socket 类的 sendUrgentData(int data) 方法用于发送一个字节的 TCP紧急数据.

     OOBINLINE 的默认值为 false, 在这种情况下, 当接收方收到紧急数据时不作任何处理, 直接将其丢弃. 如果用户希望发送紧急数据, 应该把 OOBINLINE 设为 true:

          socket.setOOBInline(true);                                                             

      此时接收方会把接收到的紧急数据

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

 

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

 

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

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

 

来源:

http://my.oschina.net/u/725800/blog/303634