本人最近在做个socket通信,客户端往服务器发送数据包,数据包不是很大,然后服务器返回数据。刚开始用原生的socket来做通信,并定时发送心跳包来维持长链接,sendUrgentData()这个就是原生的socket发送心跳包。在真实生产环境中,客户发送数据后服务器返回数据常出现异常,后改成了nio来处理收发数据。发送数据的线程中一直会保留socketChannel来做数据处理,但是发现如果socketChannel长时间不发数据会断开,我想再nio中发送心跳包来维持长连接,不知道大家是怎么做的,网上找了下资料好像所有的长连接例子都没有降到心跳包的问题....求解
------解决思路----------------------
<a href="http://bbs.csdn.net/topics/391817007">坐等解答</a>
------解决思路----------------------
你这个是做实时通信吗? 服务端网客户端推消息?/。\
------解决思路----------------------
起一个线程,定时往NIO里写数据,另一头读数据的时候要跳过心跳包。
------解决思路----------------------
这的NIO没半毛钱关系啊。
你们服务器,客户端通信的机制本身没有设计心跳机制么?如果没有,那就是通信机制的问题了。只要是长连接,就会有问题。
------解决思路----------------------
也就是说nio里面做心跳机制发送的心跳包是自定义的,服务端需要跳过处理。而纯socket的客户端发送0xFF 这样的心跳包服务器不需要做过滤处理。
这个地方问题出在urgentData和一般的data不一样,这点可以自行搜索。
其实socetchannel可以获得它对应的socket对象(通过socket方法),不知楼主有没有试过使用这个像以前一样发送urgentdata。
若行不通,则需要像你所讲,在一般的数据通道中实现自定义的心跳包协议。
------解决思路----------------------
你说的通过SocketChannel获取到socket对象然后发送数据,我试过了 貌似行不通。不知道是不是我拿socket对象有问题。我的拿socket对象这么写的
也就是说nio里面做心跳机制发送的心跳包是自定义的,服务端需要跳过处理。而纯socket的客户端发送0xFF 这样的心跳包服务器不需要做过滤处理。
这个地方问题出在urgentData和一般的data不一样,这点可以自行搜索。
其实socetchannel可以获得它对应的socket对象(通过socket方法),不知楼主有没有试过使用这个像以前一样发送urgentdata。
若行不通,则需要像你所讲,在一般的数据通道中实现自定义的心跳包协议。
SocketChannel socketChnanel = (SocketChannel) sk.channel();
socketChnanel.socket().sendUrgentData(0xFF);
获取方式是对的,没有问题。那就自己实现心跳包协议吧。