14
回答
TCP 通讯心跳包
【腾讯云】校园拼团福利,1核2G服务器10元/月!>>>   

采用JAVA的socket API设计服务端以及客户端软件,要实现TCP的长连接。但为了防止网络鼓掌或路由器导致链路中断,因此考虑采用心跳包来维持生命。

但心跳包最大问题就是产生额外的流量

请问如何来设计该心跳包能使其流量降到最底(为了适应不同的环境,心跳包的周期设置为:30s)

谢谢

举报
fcsong000833
发帖于5年前 14回/4K+阅
共有14个答案 最后回答: 5年前
网络鼓掌。。我还当是新名词。。好吧,我2了。。
--- 共有 2 条评论 ---
fcsong000833不好意思,中文不过关啊 5年前 回复
一号男嘉宾就是网络特别好,网速特别快的时候,网络用户鼓掌表示欢迎,我想起了赵本山故障的那个样子。。。 5年前 回复

引用来自“saiga”的答案

开启keepalive不行吗?

谢谢

看了下java关于该用法

client.setKeepAlive(boolean);

如何来设置其周期呢,网上查了下其周期一般是2小时,这个无法满足需求

引用来自“fcsong000833”的答案

引用来自“saiga”的答案

开启keepalive不行吗?

谢谢

看了下java关于该用法

client.setKeepAlive(boolean);

如何来设置其周期呢,网上查了下其周期一般是2小时,这个无法满足需求

好像是依赖系统内核的,你看看这连接有没有用: https://forums.oracle.com/forums/thread.jspa?threadID=1144697&tstart=885
--- 共有 3 条评论 ---
fcsong000833客户端通讯类型比较少,处理起来应该不会很大难度。 但现在还有个问题是这样做服务器压力可能会很大 5年前 回复
aiasfina回复 @fcsong000833 : 说实在,不用tcp内置的心跳包机制,实现起来麻烦N倍。客户端要根据报文头才能区分是普通数据还是心跳包,so心跳包应该是自定协议,然后 Java 要怎么做就不清楚了。 5年前 回复
fcsong000833谢谢 根据上面说的实现起来不是一般的麻烦。 看来还是的应用层自己处理 不管是系统处理还是应用层处理,关键是如何使封包数据最小。 5年前 回复
TCP传数据,UDP传心跳
--- 共有 1 条评论 ---
fcsong000833考虑过采用这种模式,但这种模式下心跳包的周期必须更小,这样算下来其浪费的流量不会减少。 5年前 回复

引用来自“fcsong000833”的答案

引用来自“saiga”的答案

开启keepalive不行吗?

谢谢

看了下java关于该用法

client.setKeepAlive(boolean);

如何来设置其周期呢,网上查了下其周期一般是2小时,这个无法满足需求

确实。该选项由setKeepAlive(boolean on)方法配置,对应底层系统的SO_KEEPALIVE套接字选项。默认值为false。如果打开该选项,则套接字会定期自动发送保持活跃的探测性消息,类似于心跳检测。根据《RFC 1122 - Requirements for Internet Hosts》的规定,保持活跃机制只是 TCP 的一个可选功能,如果支持的话,默认必须为false,而且这种机制默认在成功建立连接后,且连续两小时没有数据传输的情况下才会被激活。从另一方面来看,通过套接字的 I/O 操作完全可以知道连接是否还有效,所以该选项的实用价值不大。

我看到cobar里有个实现,LZ可以参考

顶部