java socket 参数

Java socket参数选项:

  • TCP_NODELAY:  表示当即发送数据java

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

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

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

  • SO_SNFBUF:  发送数据的缓冲区大小服务器

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

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

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

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


详细说明:

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


SoTimeout

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

SO_RESUSEADDR 选项:


SO_LINGER

启用/禁用具备指定逗留时间(以秒为单位)的 SO_LINGER。最大超时值是特定于平台的。 该设置仅影响套接字关闭。默认值为-1,表示禁用。

这个Socket选项能够影响close方法的行为。在默认状况下,当调用close方法后,将当即返回;若是这时仍然有未被送出的数据包,那么这些数据包将被丢弃。若是将linger参数设为一个正整数n时(n的值最大是65,535),在调用close方法后,将最多被阻塞n秒。在这n秒内,系统将尽可能将未送出的数据包发送出去;若是超过了n秒,若是还有未发送的数据包,这些数据包将所有被丢弃;而close方法会当即返回。若是将linger设为0,和关闭SO_LINGER选项的做用是同样的。


KeepAlive

keepalive不是说TCP的常链接,当咱们做为服务端,一个客户端链接上来,若是设置了keeplive为true,当对方没有发送任何数据过来,超过一个时间(看系统内核参数配置),那么咱们这边会发送一个ack探测包发到对方,探测双方的TCP/IP链接是否有效(对方可能断点,断网)。若是不设置,那么客户端宕机时,服务器永远也不知道客户端宕机了,仍然保存这个失效的链接。
固然,在客户端也可使用这个参数。客户端Socket会每隔段的时间(大约两个小时)就会利用空闲的链接向服务器发送一个数据包。这个数据包并无其它的做用,只是为了检测一下服务器是否仍处于活动状态。若是服务器未响应这个数据包,在大约11分钟后,客户端Socket再发送一个数据包,若是在12分钟内,服务器还没响应,那么客户端Socket将关闭。若是将Socket选项关闭,客户端Socket在服务器无效的状况下可能会长时间不会关闭。
尽管keepalive的好处并很少,可是不少开发者提倡在更高层次的应用程序代码中控制超时设置和死的套接字。同时须要记住,keepalive不容许你为探测套接字终点(endpoint)指定一个值。因此建议开发者使用的另外一种比keepalive更好的解决方案是修改超时设置套接字选项

说白了:这个参数其实对应用层的程序而言没有什么用。能够经过应用层实现了解服务端或客户端状态,而决定是否继续维持该Socket。


SendBufferSize和ReceiveBufferSize

TCP发送缓存区和接收缓存区,默认是8192,通常状况下足够了,并且就算你增长了发送缓存区,对方没有增长它对应的接收缓冲,那么在TCP三握手时,最后肯定的最大发送窗口仍是双方最小的那个缓冲区,就算你无视,发了更多的数据,那么多出来的数据也会被丢弃。除非双方都协商好。


backlog 选项:

说明:

输入链接指示(对链接的请求)的最大队列长度被设置为 backlog 参数。若是队列满时收到链接指示,则拒绝该链接。 注意:  1. backlog参数必须是大于 0 的正值。若是传递的值等于或小于 0,则假定为默认值。  2. 通过测试这个队列是按照FIFO(先进先出)的原则。 3. 若是将accept这个函数放在一个循环体中时,backlog参数也不会有什么做用。或者简单的讲运行ServerSocket的这个线程会阻塞时,不管是在accept,仍是在read处阻塞,这个backlog参数才生效。
相关文章
相关标签/搜索