NutzCN Logo
问答 问一个socket的问题
发布于 2843天前 作者 哎呦哥哥 2382 次浏览 复制 上一个帖子 下一个帖子
标签:

socket两端 有正常的数据相互传输,但是并不是一直有数据交互,
因此,为了避免长时间没有数据交互这个连接被操作系统或者防火墙之类的东西断掉,
想在socket空闲的时候发送心跳包。

思路是这样的,疑惑在于,怎么判断socket是否空闲,怎么取监控这个socket

13 回复

定时发个心跳包

无视是否空闲,定时发

@qq_4f9057d2 这样不会阻塞吗

@wendal
一条socket通道,除了心跳数据,还有业务数据,只是去定时发送的话,应该会造成阻塞吧

每次发送业务数据的时候记个时间戳,定时发送心跳包的时候,先检查这个时间戳,超过指定时间才发心跳

好比

业务线程,客户端发送一个请求,服务端返回一个结果响应

心跳线程,客户端发送心跳数据,服务端回执一条响应心跳的数据

当客户端发送请求时,刚好服务端在回执心跳,这样应该就是阻塞了吧

所以在业务线程没有数据交互的时候,让心跳线程跑起来
而怎么确定业务线程那块没有数据交互

接收就一个线程啊,阻塞什么?

@qq_4f9057d2 线程上没什么影响,socket 通道会阻塞的吧

服务器发pong包怎么就阻塞客户端发业务包,给我普及一下理论课呗

@wendal 您说的那个心跳包是 这样的方式吗

//在套接字上发送一个紧急数据字节。
sendUrgentData(int data) ;

这个方法在win7下发送17次会报错,所以我这里的心跳数据和业务数据是一个数据结构,只是根据它内部的属性区分它是业务数据还是心跳数据
可以理解为这两个线程发的都是业务数据

@qq_999005dc 不是,

心跳和业务是同一个数据结构.

添加回复
请先登陆
回到顶部