当前位置: 代码迷 >> J2SE >> nio怎么做长连接,如何发送心跳包
  详细解决方案

nio怎么做长连接,如何发送心跳包

热度:162   发布时间:2016-04-23 19:42:31.0
nio如何做长连接,怎么发送心跳包
本帖最后由 qiangcai 于 2015-08-26 16:39:19 编辑
本人最近在做个socket通信,客户端往服务器发送数据包,数据包不是很大,然后服务器返回数据。刚开始用原生的socket来做通信,并定时发送心跳包来维持长链接,sendUrgentData()这个就是原生的socket发送心跳包。在真实生产环境中,客户发送数据后服务器返回数据常出现异常,后改成了nio来处理收发数据。发送数据的线程中一直会保留socketChannel来做数据处理,但是发现如果socketChannel长时间不发数据会断开,我想再nio中发送心跳包来维持长连接,不知道大家是怎么做的,网上找了下资料好像所有的长连接例子都没有降到心跳包的问题....求解 
------解决思路----------------------
<a href="http://bbs.csdn.net/topics/391817007">坐等解答</a>
------解决思路----------------------
你这个是做实时通信吗? 服务端网客户端推消息?/。\
------解决思路----------------------
引用:
你也遇到了这样的问题,我是用NIO发送和接收数据,纯socket我知道怎么保持长链,nio不是很熟悉都不知道怎么搞,一段时间不发数据 就断了


起一个线程,定时往NIO里写数据,另一头读数据的时候要跳过心跳包。
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

你也遇到了这样的问题,我是用NIO发送和接收数据,纯socket我知道怎么保持长链,nio不是很熟悉都不知道怎么搞,一段时间不发数据 就断了


起一个线程,定时往NIO里写数据,另一头读数据的时候要跳过心跳包。
     你的意思就是发生特殊字符,让服务器那边将收到的数据处理掉,但是现在别人服务器已经做好了,不可能让别人改代码吧? 是不是跟socke一样发生0xFF 这个数据就可以了额,好奇怪NIO难道没有考虑这个问题?...


这的NIO没半毛钱关系啊。

你们服务器,客户端通信的机制本身没有设计心跳机制么?如果没有,那就是通信机制的问题了。只要是长连接,就会有问题。
------解决思路----------------------
引用:
也就是说nio里面做心跳机制发送的心跳包是自定义的,服务端需要跳过处理。而纯socket的客户端发送0xFF 这样的心跳包服务器不需要做过滤处理。

这个地方问题出在urgentData和一般的data不一样,这点可以自行搜索。
其实socetchannel可以获得它对应的socket对象(通过socket方法),不知楼主有没有试过使用这个像以前一样发送urgentdata。
若行不通,则需要像你所讲,在一般的数据通道中实现自定义的心跳包协议。
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

也就是说nio里面做心跳机制发送的心跳包是自定义的,服务端需要跳过处理。而纯socket的客户端发送0xFF 这样的心跳包服务器不需要做过滤处理。

这个地方问题出在urgentData和一般的data不一样,这点可以自行搜索。
其实socetchannel可以获得它对应的socket对象(通过socket方法),不知楼主有没有试过使用这个像以前一样发送urgentdata。
若行不通,则需要像你所讲,在一般的数据通道中实现自定义的心跳包协议。
       你说的通过SocketChannel获取到socket对象然后发送数据,我试过了 貌似行不通。不知道是不是我拿socket对象有问题。我的拿socket对象这么写的
SocketChannel socketChnanel = (SocketChannel) sk.channel();
socketChnanel.socket().sendUrgentData(0xFF);


获取方式是对的,没有问题。那就自己实现心跳包协议吧。
  相关解决方案