javasocket参数详解

12/12/2015来源:Java教程人气:1353

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_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_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

 

来源:

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