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

  • 时间:
  • 浏览:1
  • 来源:大发五分时时彩—大发分分时时彩

官方文档中解释

要解释什儿 法律法律依据的作用,首很难了解TCP套接字的一个情况报告-time-wait.

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

如图所示,



而time-wait什儿 情况报告那末来越多我连接发起方,通常那末来越多我client,在收到服务器端的FIN包后进入的情况报告.那为什儿 什儿 情况报告需用居于呢?客户端收到服务端发送的FIN包后,会向服务端发送一个ACK包,服务端接收到ACK包后进入CLOSED情况报告.那末来越多我事先网络事先已经 难题,原困服务端有事先很难收到ACK包,原困服务器端重发FIN包.

time-wait什儿 需用保持多久呢?共我希望2MSL(最大分段生存期).

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

要了解什儿 法律法律依据的作用,首很难知道TCP协议中一个注明的算法-Nagle算法.Nagle算法的初衷是防止小包拥塞网络.比如只需用发送一个字节的数据,那末来越多我事先TCP包什儿 就占用了几二个字节,那末来越多我是比较浪费网络资源的.Nagle算法原困了要么是等待英文ACK到达事先缓冲区满,才会发送新的数据.

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

事先客户端采用了Nagle算法和服务端采用了Delayed-ACK,同時 客户端采用write-write-read模式,就很容易造成客户端与服务端有无等待英文对方数据的难题.

Delayed Ack 是有个超时机制的,而默认的超时正好那末来越多我40ms.

这里有一篇文章很好的介绍了write-write-read什儿 难题 setTcpNoDelay我觉得那末来越多我讲Nagle算法关闭,使得每次无论数据包有多大不会被立即发送.

通过以上代码,能都还可不能能看到用到了jdk中相关的Socket对象来与redis服务进行程序池池.重点看好多个法律法律依据

了解了什儿 事先,大伙能都还可不能能看看什儿 法律法律依据的实物实现

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

将此选项设为非零的超时值时,在与此 Socket 关联的 InputStream 上调用 read() 将只阻塞此时间长度。事先超过超时值,将引发java.net.SocketTimeoutException,觉得 Socket

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

参数:

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

抛出:

SocketException -

事先底层协议出先错误,相似 TCP 错误。

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

什儿 套接字选项通知内核,事先端口忙,但TCP情况报告居于 TIME_WAIT ,能都还可不能能重用端口。事先端口忙,而TCP情况报告居于已经 情况报告,重用端口时依旧得到一个错误信息,指明"地址事先使用中"。事先你的服务程序池池停止后想立即重启,而新套接字依旧使用同一端口,此时 SO_REUSEADDR 选项非常有用。

SO_LINGER选项用来控制Socket关闭时的行为,默认情况报告下,执行Socket的close法律法律依据,该法律法律依据会立即返回,但底层的Socket实际上之那末来越多会立即关闭,他会立即延迟一段时间,知道发送完剩余的数据,才会真正的关闭Socket,断开连接。

在那末来越多教材事先教程上,通常有无很简单的一个例子来演示如何使用Java进行TCP通讯.在这款广泛被使用的开源组件中,大伙都都还可不能能更好的学习到一个企业级的组件在TCP连接的防止上,更应该关注什儿 方面.有什儿 是大伙应该掌握事先了解的TCP知识.TCP协议什儿 相当错综复杂,大伙做应用的能都还可不能能先从应用层需用用到的相关知识开始英语 了解.

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

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

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

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