从jedis源码中学习java socket client端的基本用法

  • 时间:
  • 浏览:3
  • 来源:万人牛牛棋牌_万人牛牛棋牌官网

这种 套接字选项通知内核,可能性端口忙,但TCP清况 发生 TIME_WAIT ,都时要重用端口。可能性端口忙,而TCP清况 发生这种 清况 ,重用端口时依旧得到1个多多错误信息,指明"地址可能性使用中"。可能性你的服务程序停止后想立即重启,而新套接字依旧使用同一端口,此时 SO_REUSEADDR 选项非常有用。

MSL(最大分段生存期)指明TCP报文在Internet上最长生存时间,每个具体的TCP实现都时要选择1个多多选择的MSL值。RFC 1122建议是2分钟,但BSD传统实现采用了200秒。

启用/禁用中有 指定超时值的 SO_TIMEOUT,以毫秒为单位。

大伙儿儿看了,它是对SO_REUSEADDR这种 套接字选项进行了设置.

对应linux操作系统响应的配置为

要解释这种 土方法的作用,首太难了解TCP套接字的1个多多清况 -time-wait.

众所周知,TCP的连接建立和断开要经历三次握手和四次挥手.

如图所示,



而time-wait这种 清况 要是连接发起方,通常要是client,在收到服务器端的FIN包后进入的清况 .那如保这种 清况 时要发生呢?客户端收到服务端发送的FIN包后,会向服务端发送1个多多ACK包,服务端接收到ACK包后进入CLOSED清况 .如保让可能性网络可能性这种 疑问,因为服务端有可能性太难收到ACK包,因为服务器端重发FIN包.

time-wait这种 时要保持多久呢?大约是2MSL(最大分段生存期).

SO_LINGER选项用来控制Socket关闭时的行为,默认清况 下,执行Socket的close土方法,该土方法会立即返回,但底层的Socket实际上不想说会立即关闭,他会立即延迟一段时间,知道发送完剩余的数据,才会真正的关闭Socket,断开连接。

官方文档中解释

在要是教材可能性教程上,通常有的是很简单的1个多多例子来演示如保使用Java进行TCP通讯.在这款广泛被使用的开源组件中,大伙儿儿并能更好的学习到1个多多企业级的组件在TCP连接的处理上,更应该关注什么方面.有什么是大伙儿儿应该掌握可能性了解的TCP知识.TCP协议并有的是相当错综复杂,大伙儿儿做应用的都时要先从应用层时要用到的相关知识日后结束解.

jedis中,与redis服务端建立连接的代码在Connection这种 类中.

将此选项设为非零的超时值时,在与此 Socket 关联的 InputStream 上调用 read() 将只阻塞此时间长度。可能性超过超时值,将引发java.net.SocketTimeoutException,我虽然 Socket

仍旧有效。选项时要在进入阻塞操作前被启用并能生效。超时值时要是 > 0 的数。超时值为 0 被解释为无穷大超时值。

参数:

timeout - 指定的以毫秒为单位的超时值。

抛出:

SocketException -

可能性底层协议出先错误,之类 TCP 错误。

执行该土方法,太难执行Socket的close土方法,该土方法也会立即返回,但底层的Socket也会立即关闭,所有未发送完的剩余数据被丢弃.

了解了什么原先,大伙儿儿都时要看看这种 土方法的实物实现

通过以上代码,都时要看了用到了jdk中相关的Socket对象来与redis服务进行程序.重点看哪几个土方法

心跳检测是大伙儿儿用来判断后端程序有无依旧正常服务的1个多多常用手段.TCP协议提供keepalive机制来监测TCP连接有无可能性断开.

要了解这种 土方法的作用,首太难知道TCP协议中1个多多注明的算法-Nagle算法.Nagle算法的初衷是处理小包拥塞网络.比如只时要发送1个多多字节的数据,原先可能性TCP包并有的是就占用了几四个字节,原先是比较浪费网络资源的.Nagle算法因为了要么是守候ACK到达可能性缓冲区满,才会发送新的数据.

再介绍一下TCP-Delayed-ACK ,它是将ACK和响应数据绑在1个多多包中发送,降低协议开销.

可能性客户端采用了Nagle算法和服务端采用了Delayed-ACK,一块儿客户端采用write-write-read模式,就很容易造成客户端与服务端有的是守候对方数据的疑问.

Delayed Ack 是有个超时机制的,而默认的超时正好要是40ms.

这里有一篇文章很好的介绍了write-write-read这种 疑问 setTcpNoDelay我我虽然要是讲Nagle算法关闭,使得每次无论数据包有多大一定会被立即发送.