- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java 套接字 Socket 编程--TCP 参数
在 Java 的 Socket 中,主要包含了以下可设置的 TCP 参数。
属性
属性
说明
默认值
SO_TIMEOUT
TCP_NODELAY SO_LINGER SO_SNDBUF SO_RCVBUF SO_KEEPALIVE SO_REUSEADDR
BACKLOG
对 ServerSocket 来说表示等待连接的最长空等
待时间; 对 Socket 来说表示读数据最长空等待时间。
是否一有数据就马上发送。
优雅地关闭套接字,或者立刻关闭。发送数据的缓冲区大小。
接收数据的缓冲区大小。是否启用心跳机制。
是否地址重用。
服务端处理线程全忙后,允许多少个新请求进入等待。
0
false
-1 8K
8K
false false
50
BACKLOG
ServerSocketserverSocket=newServerSocket(8080,100);BACKLOG 用于构造服务端套接字 ServerSocket 对象,标识当服务器请求处理线程全满时,用于临时存放已完成三次握手的请求的队列的最大长度。如果未设置或所设置的值小于1,Java 将使用默认值50。
ServerSocketserverSocket=newServerSocket(8080,100);
TCP_NODELAY
在 TCP/IP 协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送 ACK 表示确认。为了尽可能的利用网络带宽,TCP 总是希望尽可能的发送足够大的数据。这里就涉及到一个名为 Nagle 的算法,该算法的目的就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。
TCP_NODELAY 选项,就是用于启用或关于 Nagle 算法。如果要求高实时性,有数据发送时就马上发送,就将该选项设置为true 关闭 Nagle 算法;如果要减少发送次数减少网络交互,就设置为false 等累
voidsetTcpNoDelay(booleanon)启用/禁用 TCP_NODELAY(启用/禁用 Nagle 算法)。
voidsetTcpNoDelay(booleanon)
启用/禁用 TCP_NODELAY(启用/禁用 Nagle 算法)。
booleangetTcpNoDelay()
测试是否启用 TCP_NODELAY。
关于 Nagle 算法介绍,请参考附录部分。
SO_TIMEOUT
对于服务端套接字 ServerSocket 来说,SO_TIMEOUT 表示服务端 accept 方法空等待客户端连接的最长时间;对于客户端套接字 Socket 来说,SO_TIMEOUT 表示输入流读取数据 read 方法的最长等待时间。一旦超过设置的 SO_TIMEOUT,程度将抛出超时异常。
ServerSocket/Socket 中操作该属性的方法如下:
intgetSoTimeout()
intgetSoTimeout()
返回 SO_TIMEOUT 的设置。
voidsetSoTimeout(inttimeout)
启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。
使用示例:
ServerSocketserverSocket=newServerSocket(8080);
ServerSocketserverSocket=newServerSocket(8080);
serverSocket.setSoTimeout(30000);
SocketclientSocket=serverSocket.accept();
clientSocket.setSoTimeout(20000);
SO_LINGER
当调用 closesocket 关闭套接字时,SO_LINGER 将决定系统如何处理残存在套接字发送队列中的数据。处理方式无非两种:丢弃或者将数据继续发送至对端,优雅关闭连接。事实上, SO_LINGER 并不被推荐使用,大多数情况下我们推荐使用默认的关闭方式(即下方表格中的第一种情况)。
下方代码段显示 linger 结构语法,表格为不同参数情况下的套接字行为。
typedefstructlinger{
typedefstructlinger{
u_shortl_onoff; //开关,零或者非零
u_shortl_linger;
u_shortl_linger;
}linger;
//优雅关闭最长时限
各字段与对应行为如下表所示。
l_onoff
l_linger
closesocket 行为
发送队列
底层行为
零
忽略
立即返回。
保持直至发送完成。
系统接管套接字并保证将数据发送至对端。
非零
零
立即返回。
立即放弃。
直接发送 RST
文档评论(0)