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

逆水行舟不进则退 2015-08-26 02:23:44
本人最近在做个socket通信,客户端往服务器发送数据包,数据包不是很大,然后服务器返回数据。刚开始用原生的socket来做通信,并定时发送心跳包来维持长链接,sendUrgentData()这个就是原生的socket发送心跳包。在真实生产环境中,客户发送数据后服务器返回数据常出现异常,后改成了nio来处理收发数据。发送数据的线程中一直会保留socketChannel来做数据处理,但是发现如果socketChannel长时间不发数据会断开,我想再nio中发送心跳包来维持长连接,不知道大家是怎么做的,网上找了下资料好像所有的长连接例子都没有降到心跳包的问题....求解
...全文
1023 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
微wx笑 2017-09-29
  • 打赏
  • 举报
回复
使用TCP,理论上是底层去发心跳包,上层只处理业务逻辑就可以了吧。
minGW_Lee 2017-09-22
  • 打赏
  • 举报
回复
你好,请问你这个最终是怎么解决的呢
  • 打赏
  • 举报
回复
谢谢大家的支持,SocketChannel发送心跳包这个问题很有肯能是跟大家说的一样需要自定义心跳包内容,服务器将心跳包的过滤掉,但是我这里没有这么样去做(不知道是不是又其他办法)。本人是这么做的,创建一个SocketChannel后,一直使用SocketChannel发送数包,检测到SocketChannel过期了或超时了就重修创建一个SocketChannel,然后再次发送。 判断是否和服务器之间断网我依旧使用的纯socket来处理的如:socket().sendUrgentData(0xFF); nio发送心跳包大家如果有好的处理方式欢迎留言。撒分了
  • 打赏
  • 举报
回复
引用 10 楼 mg2flyingff 的回复:
[quote=引用 9 楼 qiangcai 的回复:] 也就是说nio里面做心跳机制发送的心跳包是自定义的,服务端需要跳过处理。而纯socket的客户端发送0xFF 这样的心跳包服务器不需要做过滤处理。
这个地方问题出在urgentData和一般的data不一样,这点可以自行搜索。 其实socetchannel可以获得它对应的socket对象(通过socket方法),不知楼主有没有试过使用这个像以前一样发送urgentdata。 若行不通,则需要像你所讲,在一般的数据通道中实现自定义的心跳包协议。[/quote] 你说的通过SocketChannel获取到socket对象然后发送数据,我试过了 貌似行不通。不知道是不是我拿socket对象有问题。我的拿socket对象这么写的 SocketChannel socketChnanel = (SocketChannel) sk.channel(); socketChnanel.socket().sendUrgentData(0xFF);
0萌萌哒0 2015-08-28
  • 打赏
  • 举报
回复
引用 11 楼 qiangcai 的回复:
[quote=引用 10 楼 mg2flyingff 的回复:] [quote=引用 9 楼 qiangcai 的回复:] 也就是说nio里面做心跳机制发送的心跳包是自定义的,服务端需要跳过处理。而纯socket的客户端发送0xFF 这样的心跳包服务器不需要做过滤处理。
这个地方问题出在urgentData和一般的data不一样,这点可以自行搜索。 其实socetchannel可以获得它对应的socket对象(通过socket方法),不知楼主有没有试过使用这个像以前一样发送urgentdata。 若行不通,则需要像你所讲,在一般的数据通道中实现自定义的心跳包协议。[/quote] 你说的通过SocketChannel获取到socket对象然后发送数据,我试过了 貌似行不通。不知道是不是我拿socket对象有问题。我的拿socket对象这么写的 SocketChannel socketChnanel = (SocketChannel) sk.channel(); socketChnanel.socket().sendUrgentData(0xFF);[/quote] 获取方式是对的,没有问题。那就自己实现心跳包协议吧。
skgary 2015-08-27
  • 打赏
  • 举报
回复
引用 5 楼 qiangcai 的回复:
[quote=引用 4 楼 skgary 的回复:] [quote=引用 2 楼 qiangcai 的回复:] 你也遇到了这样的问题,我是用NIO发送和接收数据,纯socket我知道怎么保持长链,nio不是很熟悉都不知道怎么搞,一段时间不发数据 就断了
起一个线程,定时往NIO里写数据,另一头读数据的时候要跳过心跳包。[/quote] 你的意思就是发生特殊字符,让服务器那边将收到的数据处理掉,但是现在别人服务器已经做好了,不可能让别人改代码吧? 是不是跟socke一样发生0xFF 这个数据就可以了额,好奇怪NIO难道没有考虑这个问题?...[/quote] 这的NIO没半毛钱关系啊。 你们服务器,客户端通信的机制本身没有设计心跳机制么?如果没有,那就是通信机制的问题了。只要是长连接,就会有问题。
  • 打赏
  • 举报
回复
没人知道是什么问题么
0萌萌哒0 2015-08-27
  • 打赏
  • 举报
回复
引用 9 楼 qiangcai 的回复:
也就是说nio里面做心跳机制发送的心跳包是自定义的,服务端需要跳过处理。而纯socket的客户端发送0xFF 这样的心跳包服务器不需要做过滤处理。
这个地方问题出在urgentData和一般的data不一样,这点可以自行搜索。 其实socetchannel可以获得它对应的socket对象(通过socket方法),不知楼主有没有试过使用这个像以前一样发送urgentdata。 若行不通,则需要像你所讲,在一般的数据通道中实现自定义的心跳包协议。
  • 打赏
  • 举报
回复
也就是说nio里面做心跳机制发送的心跳包是自定义的,服务端需要跳过处理。而纯socket的客户端发送0xFF 这样的心跳包服务器不需要做过滤处理。
  • 打赏
  • 举报
回复
引用 3 楼 rui888 的回复:
你这个是做实时通信吗? 服务端网客户端推消息?/。\
是的 坐的就是客户端往服务器那边发个消息 然后服务器立马返回消息给我。
  • 打赏
  • 举报
回复
引用 4 楼 skgary 的回复:
[quote=引用 2 楼 qiangcai 的回复:] 你也遇到了这样的问题,我是用NIO发送和接收数据,纯socket我知道怎么保持长链,nio不是很熟悉都不知道怎么搞,一段时间不发数据 就断了
起一个线程,定时往NIO里写数据,另一头读数据的时候要跳过心跳包。[/quote] 你的意思就是发生特殊字符,让服务器那边将收到的数据处理掉,但是现在别人服务器已经做好了,不可能让别人改代码吧? 是不是跟socke一样发生0xFF 这个数据就可以了额,好奇怪NIO难道没有考虑这个问题?...
skgary 2015-08-26
  • 打赏
  • 举报
回复
引用 2 楼 qiangcai 的回复:
你也遇到了这样的问题,我是用NIO发送和接收数据,纯socket我知道怎么保持长链,nio不是很熟悉都不知道怎么搞,一段时间不发数据 就断了
起一个线程,定时往NIO里写数据,另一头读数据的时候要跳过心跳包。
tony4geek 2015-08-26
  • 打赏
  • 举报
回复
你这个是做实时通信吗? 服务端网客户端推消息?/。\
  • 打赏
  • 举报
回复
你也遇到了这样的问题,我是用NIO发送和接收数据,纯socket我知道怎么保持长链,nio不是很熟悉都不知道怎么搞,一段时间不发数据 就断了
马七甲 2015-08-26
  • 打赏
  • 举报
回复
<a href="http://bbs.csdn.net/topics/391817007">坐等解答</a>

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧