Java socket参数选项:

  • TCP_NODELAY:  表示立即发送数据

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

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

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

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

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

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

  • OOBINLINE: 表示是否支持发送一个字节的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参数才生效。

Java Socket 参数详解相关推荐

  1. java socket参数详解:OOBInline和UrgentData .

    TCP的紧急指针,一般都不建议使用,而且不同的TCP/IP实现,也不同,一般说如果你有紧急数据宁愿再建立一个新的TCP/IP连接发送数据,让对方紧急处理.但是,虽然sendUrgentData的参数d ...

  2. java ext.dirs_关于-Djava.ext.dirs使用及JAVA 命令参数详解System.setProperty

    大家在linux环境下使用命令行执行java程序时,经常要使用到大量外部的jar包或class文件,一般我们有哪些方式可以用呢? -classpath,命令格式:# java -classpath , ...

  3. Java Socket编程详解

    Java Socket编程是Java网络编程很重要的内容,现参考了许多资料,总结如下: 1. Java网络编程原理+Socket编程 http://www.cnblogs.com/linzheng/a ...

  4. java backlog满_java socket参数详解:BackLog

    输入连接指示(对连接的请求)的最大队列长度被设置为 backlog 参数.如果队列满时收到连接指示,则拒绝该连接. 注意: 1. backlog参数必须是大于 0 的正值.如果传递的值等于或小于 0, ...

  5. 【Netty】option(ChannelOption.SO_KEEPALIVE, true) socket参数详解:KeepAlive

    .childOption(ChannelOption.SO_KEEPALIVE, true); childOption是用来给父级ServerChannel之下的Channels设置参数的 当设置为t ...

  6. java虚拟机参数详解

    Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOME\bin\java –option 来启动,-option为虚拟机参数,JAVA_H ...

  7. java 可变参数 详解(通俗易懂)

    目录 一.概述: 二.格式: 三.注意事项(使用规范): 四.代码演示: 演示规范①~③: 演示规范④: 演示规范⑤: 课堂练习: 代码演示: 输出结果: 五.英文版本讲解: 一.概述: java中, ...

  8. Java运行参数详解

    JRE版本 admindeMacBook-Pro:~ admin$ java -version java version "1.8.0_111" Java(TM) SE Runti ...

  9. java命令行参数详解

    java 命令参数详解_赶路人儿的博客-CSDN博客_java命令行参数java命令用于启动 java 应用:它首先会启动 java 运行时环境(JRE),然后加载指定的类,调用类的main()方法. ...

最新文章

  1. statusStrip 状态条 toolStripStatusLabel 居右显示
  2. iBatis应用之获取表的元数据
  3. c语言用数组发送大写字母怎么读,c语言字符数组大小写转换
  4. html语言中空格用什么表示,HTML中的5种空格各表示的意义
  5. 测试驱动开发 测试前移_测试驱动开发:它是什么,什么不是。
  6. centos 搭建Jenkins
  7. idea新建web工程
  8. mset redis_redis mset string 命令简介
  9. SQL Server基础之索引
  10. SpringMVC + AJAX 实现多文件异步上传
  11. 计算机组成原理核心总结
  12. Beta 冲刺(7/7)
  13. Unity 性能优化归纳
  14. CAD插件学习系列教程(二) 燕秀工具箱的使用
  15. ps去水印教程_Ps去水印教程:简单三步教新手学习去狮子图像上的水印,多余的文...
  16. eNSP模拟简单网络环境
  17. 微服务设计 10 大反模式和陷阱
  18. 【iOS】仿写iOS计算器总结
  19. protect权限解析
  20. 罗扎诺夫高效记忆音乐【推荐试试】 - 雅思资料下载 - 鲤鱼网 - 专业的考试资料下载交流平台...

热门文章

  1. 不要去外包亲身经历告诉你 去外包的后果
  2. Design?Design!
  3. 关于nignx老是报错404的问题
  4. web前端期末大作业 html+css家乡旅游主题网页设计---湖南 登录或注册表单
  5. sso 登出_最强SSO单点登录教程(三)单点注销流程分析
  6. python 实现京东滑块验证码登录
  7. Android-谷歌语音识别之离线识别(二)
  8. LocalDate日期操作与处理
  9. g729源码分析-5-基音周期搜索(下)
  10. http请求错误解释