文章目录

  • I 设置读取超时时间
  • II Socket 复用绑定端口设置
  • III 开启 Nagle 算法 ( 沾包 )
  • IV 心跳包机制
  • V 连接关闭处理
  • VI Socket 紧急数据内敛设置
  • VII Socket 设置缓冲区大小
  • VIII Socket 连接性能参数设置

I 设置读取超时时间


1. 设置 Socket 超时时间 , 该超时时间没有实际的概念 , 用于设置与阻塞相关操作的超时时间 , TCP 连接中有两个需要阻塞的操作 :

  • ① 连接服务器操作 ;
  • ② 等待读取服务器发送给客户端的数据 ;

连接超时时间可以单独设置 , 这里设置的读取超时时间 ;

2. 单位 : 毫秒 ( ms ) ;

3. 设置一个非 0 的超时时间 , 当与 Socket 对象关联的 InputStream 输入流执行 read() 操作时 , 其阻塞时间为这个超时时间 , 如果超过了该时间还没有收到任何数据 , 就会抛出异常 ;

socket.setSoTimeout(3000);

II Socket 复用绑定端口设置


设置是否可以复用 Socket 绑定的地址和端口号 : setReuseAddress( true ) ;

socket.setReuseAddress(true);

Socket 连接在建立时 , 会使用之前绑定本地的 IP 地址和端口号 , 这个端口号在使用之后 , 2 分钟之内不允许再次使用 ; 进行了该设置之后 , 可以在连接关闭之后 , 马上使用该本地 IP 地址和端口号 ;

III 开启 Nagle 算法 ( 沾包 )


1. 前提 : TCP 发送数据后 , 接收方会反馈已经接受到的数据 ;

2. 示例 : 客户端如果向服务器端发送 1 字节数据 , 服务器端需要反馈 ACK 信息 , ACK 的命令其大小要比传输的数据还要大 , 其消耗要高于实际的数据传输消耗 ;

3. Nagle 算法引入 : 为了避免上述情况的消耗 , 便有了 Nagle 算法 ;

  • ① 服务器端处理 : 其原理是接收端接到数据后 , 如果数据很小 , 那就多接收几个数据 , 然后将反馈信息一起回送给发送端 ;
  • ② 客户端处理 : 对应的客户端处理便是一条数据发送之后 , 会等待服务器端反馈 , 然后这段时间内如果又有新的数据要发送 , 那么就会将这些数据缓存起来 , 等待前面的数据反馈信息回送之后 , 将发送端缓存的这些数据全部发送出去 ; 这样就出现了沾包的情况 ;

4. Nagle 算法好处 : Nagle 算法有效的减少了因发送少量数据 , 而产生大量的 ACK 回送包的数据量 ; 优化网络带宽 ;

在需要低延迟传输的情况下是需要关闭该算法的 , 该算法会导致数据沾包情况出现 ;

socket.setTcpNoDelay(true);

IV 心跳包机制


设置了 setKeepAlive(true) 之后的效果 : 如果 TCP 连接在 2 小时之内没有数据传输 , 客户端就会发送心跳包 , 服务器端会会送消息 , 如果客户端没有收到服务器端反馈信息 , 就认为该 TCP 连接已经断开 , 客户端会抛出异常信息 ;

//在长时间 ( 2 小时 ) 没有数据交互 , 是否需要发送心跳包确认连接
socket.setKeepAlive(true);

V 连接关闭处理


1. 连接关闭处理 : 对于连接关闭行为处理方式设置 , 调用 setSoLinger 函数设置 ;

2. 关闭情况说明 : 当 Socket 对象调用 close 方法关闭连接时 , 有可能缓冲区中还有数据没有发送完成 , 这个方法就是用于处理这部分缓冲区数据的 ;

3. setSoLinger 函数原型 :

    /*** Enable/disable {@link SocketOptions#SO_LINGER SO_LINGER} with the* specified linger time in seconds. The maximum timeout value is platform* specific.** The setting only affects socket close.** @param on     whether or not to linger on.* @param linger how long to linger for, if on is true.* @exception SocketException if there is an error* in the underlying protocol, such as a TCP error.* @exception IllegalArgumentException if the linger value is negative.* @since 1.1* @see #getSoLinger()*/public void setSoLinger(boolean on, int linger) throws SocketException

4. setSoLinger 参数解析 :

  • ① boolean on : TCP 连接关闭处理功能是否打开 , 默认是关闭的 ( false ) ;
  • ② int linger : Socket 调用 close 方法后 , 需要阻塞等待缓冲区数据发送的时间 , 单位毫秒 ;

5. 默认状态 : 如果 boolean on 设置成false , 不处理连接的缓存数据 , 调用 close 会立刻关闭连接 , 系统底层会操作输出流发送剩余缓存数据 , 将缓冲区中的数据发送给连接对方 ; 如果设置 false 不会产生阻塞操作 ;

6. 开启连接关闭处理 : setSoLinger( true , 20 ) 情况 , 如果设置 boolean on 参数为 true , int linger 参数设置一个大于等于 0 的参数 , 那么在关闭的时候 , 阻塞 linger 毫秒 , 之后缓冲区如果还有数据 , 就会被丢弃 , 直接向连接对方发送结束命令 , 无需经过超时等待 ;

超时等待是数据达到对方并返回的最长等待时间 ( MSL ) ;

7. 开启连接关闭处理 ( 不阻塞 ) : setSoLinger( true , 0 ) 情况 , 如果设置成 0 , 那么其后果是不阻塞 , 也不让系统接管输出流 , 立刻丢弃缓冲区数据 , 向对方发送 RST 命令 ;

VI Socket 紧急数据内敛设置


//设置紧急数据是否内敛 , 默认情况时 false 关闭的 ;
socket.setOOBInline(true);

1. 紧急数据 : 紧急数据是 Socket 对象通过调用 sendUrgentData 发送出去的数据 ; 该方法参数是一个 int 值 , 仅有最低的 8 位是有效的 ;

2. 紧急数据透明特性 : 紧急数据默认情况下与上层的数据是隔离的 , 如客户端给服务器端发送了一条紧急数据 , 服务器端照常接收处理普通数据 , 其不影响数据的接收与处理 , 也不知道客户端发送了紧急数据 ;

3. 接收紧急数据 : 如果服务器端想要接收客户端发送的紧急数据 , 那么需要在获取 Socket 输入流之前设置 socket.setOOBInline(true) , 才能在接收数据时 , 读取到紧急数据 ;

4. 设置紧急数据 : setOOBInline 方法设置紧急数据是否内敛 , 默认情况时 false 关闭的 ;

5. 适用场景 : 使用紧急数据当做心跳包 ;

不建议设置紧急数据内敛 , 可能会影响实际数据的正确性 ;

VII Socket 设置缓冲区大小


1. 缓冲区大小设置包括两个缓冲区设置 :

  • ① 发送缓冲区设置 :
socket.setSendBufferSize(64 * 1024 * 1024);
  • ② 接收缓冲区设置 ;
socket.setReceiveBufferSize(64 * 1024 * 1024);

2. 缓冲区作用 : 缓冲区大小默认 32 KB , 缓冲区大小不是要等到有 32 KB 数据才进行发送和接收 , 而是如果发送和接收的数据大于 32 KB , 如 33 KB , 就会将数据拆分成两包 , 32 KB 和 1KB , 然后进行发送和接收操作 ;

注意设置一定要在连接之前设置 , 连接后设置时无效的 ;

VIII Socket 连接性能参数设置


1. 调用 Socket 对象的 setPerformancePreferences 方法 , 设置连接的性能参数 ; 连接有以下三个性能参数 :

  • ① 连接时间 ;
  • ② 往返延迟 ;
  • ③ 带宽 ;

2. 设置的是权重不是具体性能参数 : 设置的值不是具体的参数 , 而是连接的性能权重 , 对哪个性能要求比较高 ;

3. 连接时间 : 如果该 Socket 的连接很频繁 , 连接后传一个数据 , 马上断开 , 这时候比较看重连接时间性能 , 此时可以将第一个参数设置成 10 , 后两个参数设置成 1 , 表示注重连接时间性能 ;

//设置 连接时间 性能参数较重要
socket.setPerformancePreferences(10, 1, 1);

4. 往返延迟 : 如果开发的是网游服务器 , 此时对延迟很看重 , 这时候可以将第二个参数设置成比较高的权重 ;

//设置 往返延迟 性能参数较重要
socket.setPerformancePreferences(1, 10, 1);

5. 带宽 : 如果开发的是音视频服务器 , 注重带宽性能 , 此时需要将第三个参数设置成较高的权重 ;

//设置 带宽 性能参数较重要
socket.setPerformancePreferences(1, 10, 1);

6. 上面的延迟和带宽的性能是互斥的 , 延迟低 , 就意味着很小的包就要发送一次 , 其带宽就低了 , 延迟高了 , 每次积累很多数据才发送 , 其带宽就相应的提高了 ;

7. 函数原型 :

    /*** Sets performance preferences for this socket.** <p> Sockets use the TCP/IP protocol by default.  Some implementations* may offer alternative protocols which have different performance* characteristics than TCP/IP.  This method allows the application to* express its own preferences as to how these tradeoffs should be made* when the implementation chooses from the available protocols.** <p> Performance preferences are described by three integers* whose values indicate the relative importance of short connection time,* low latency, and high bandwidth.  The absolute values of the integers* are irrelevant; in order to choose a protocol the values are simply* compared, with larger values indicating stronger preferences. Negative* values represent a lower priority than positive values. If the* application prefers short connection time over both low latency and high* bandwidth, for example, then it could invoke this method with the values* {@code (1, 0, 0)}.  If the application prefers high bandwidth above low* latency, and low latency above short connection time, then it could* invoke this method with the values {@code (0, 1, 2)}.** <p> Invoking this method after this socket has been connected* will have no effect.** @param  connectionTime*         An {@code int} expressing the relative importance of a short*         connection time** @param  latency*         An {@code int} expressing the relative importance of low*         latency** @param  bandwidth*         An {@code int} expressing the relative importance of high*         bandwidth** @since 1.5*/public void setPerformancePreferences(int connectionTime,int latency,int bandwidth)

【Java 网络编程】客户端 Socket 配置 ( 超时时间 | 端口复用 | Nagle 算法 | 心跳包机制 | 连接关闭机制 | 缓冲区大小 | 性能权重设置 | 紧急数据设置 )相关推荐

  1. Java网络编程:socket与Netty

    Java网络编程:socket与Netty Java网络编程:socket与Netty TCP/IP介绍 简介 数据传输 TCP粘包和黏包 现象 为什么出现 如何解决 Socket介绍 介绍 功能开发 ...

  2. Java网络编程(Socket、URLConnection)

    文章目录 TCP和OSI参考模型 混迹于各层的网络协议 UDP协议 TCP协议 InetAddress类及其常用方法 UDP之DatagramSocket&DatagramPacket TCP ...

  3. 【Java 网络编程】Socket TCP UDP 联系

    文章目录 I 信息传输关注点 II Socket 与 TCP UDP 关系 III Socket 连接组成 ( IP地址 + 端口号 ) IV Socket TCP V Socket UDP VI C ...

  4. JAVA 网络编程(5) SOCKET UDP 单播和组播,以及组播其他机器收不到报文的解决方法

    UDP既可以单播也可以组播 一,单播 单播的过程为 发送方: InetAddress destAddr = InetAddress.getByName("192.168.4.199" ...

  5. Java网络编程 Socket、ServerSocket 详解,方法介绍及完整代码示例

    Java网络编程 Socket.ServerSocket 详解,方法介绍及完整代码示例 概念 什么是网络编程? 网络编程是指编写运行在多个设备(计算机)的程序,这些设备通过网络连接起来.当这些通过网络 ...

  6. java 网络实验_20145220 实验五 Java网络编程

    20145220 实验五 Java网络编程 实验内容 1.用书上的TCP代码,实现服务器与客户端. 2.客户端与服务器连接 3.客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务 ...

  7. Java 网络编程 03 —— URL下载资源

    系列文章目录 Java 网络编程 01 -- Socket TCP通信 Java 网络编程 02 -- Socket UDP通信 Java 网络编程 03 -- URL下载资源 文章目录 系列文章目录 ...

  8. java网络编程socket\server\TCP笔记(转)

    java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅 1 TCP的开销 a  连接 ...

  9. Java网络编程:实现QQ邮件发送客户端

    目录 一.目标介绍 1.认识SMTP(邮件传输协议) 2.POP3(邮件接收协议) 二.基于Base64编码邮箱及授权码 1.开通QQ邮箱SMTP/POP3服务 2.Java编写BASE64编码程序 ...

最新文章

  1. RNAseq-GO、biomaRt转换ID
  2. Android应用程序键盘(Keyboard)消息处理机制分析(17)
  3. gettext()方法输出空白_如何将文档内容输出为无水印图片?超简单的操作方法看这里...
  4. 个人的小项目mysql_mgr_test开放了
  5. C .Adding Powers codeforces(位运算思维)
  6. 搭建MSSM框架(Maven+Spring+Spring MVC+MyBatis)
  7. 【转】magento性能优化的教程(非常详细)
  8. 从mysql取出数据封装成json中遇到特殊字符自动转成unicode解决方案
  9. mybatis在oracle数据库中获取主键
  10. win hook codeproject
  11. 两种方式实现序列检测:三段式状态机、移位寄存器+比较器(含testbench激励代码)
  12. 前端工程师薪资差距可达7.3倍!4月程序员薪资统计出炉,速看!
  13. 竞争型神经网络:自组织映射神经网络(SOM)
  14. 教你如何养微信小号,什么样的号可以群爆粉?
  15. 服务器命令里面怎么删除文件,scp删除服务器文件命令
  16. pandas——显示设置
  17. 淘特,阿里在下沉市场的一把好刀
  18. Android 修改保持WLAN热点开启的时间与最大连接数
  19. 北京工作居住证续签注意的问题
  20. 【Unity 实战100例】 教程 专栏《导航目录帖》带你深入学习Unity实战经验

热门文章

  1. leetcode 43. 字符串相乘(Multiply Strings)
  2. javascript中获取dom元素高度和宽度
  3. sqlserver2008r2升级到2012的问题
  4. jQueryui autocomplete使用示例
  5. C#+Mapxtreme 实现一些GIS系统基本的功能
  6. 【Android】Touch事件分发
  7. 关于图片轮播的几种思路
  8. Apache2.2.16+PHP5.3.3+MySQL5.1.49的配置方法
  9. UVa 10420 List of Conquests
  10. http://www.csdn.net/