C# socket 通信系统,socket断线重连问题

本人再做一个C#开发的socket 通信系统,在连接的过程中我做了测试连接,就是测试服务端和客户度是否连接。实现原理为
客户端定时发送信号给服务器,然后在指定时间内能够收到服务端发回来的信号,则表示没有掉线,如果在指定时间内没有收到服务端发回来的信号,则客户端认为已经和服务器断开了连接,则客户端会发一个断线信号给服务端,服务端会把客户在线列表清除这个客户端连接,然后客户端会重新再和服务器创建连接。
(备注,客户端和服务端是多对一的关系,客户端之间的通信都要进过服务端的转发)

也就是在这个过程中,客户端发个服务端的信号,服务端都能接受,也能做出了相应的处理,也就是说,服务端接收到了客户端的信号,也发送回去给客户端信号了,但是可能就是客户端没有收到服务端的信号,而产生了自主断线,重连。

就出现了,两个人在打电话,一个能听见声音,但是另一个不能听见声音,但是挂了重新接通电话,则双方听见声音了。

如何让socket连接不要出现以上的那些现象,请高手分析下,这是什么原因,还有我应该如何写这个客户端和服务端,测试连接的代码,也就是所谓的心跳测试这个东东,最好有类似源码(C#的),发到我邮箱clb_wmj@163.com ,谢谢各位的帮助
最新回答
仙女不仙

2024-09-21 05:21:13

首先断线有很多可能,服务器端代码错误或者网络路由问题,等等,解决这些断线问题的方法就是心跳检测,看应用需要采用几秒客户端(C)向服务器端发送【ping】协议(协议名称可以自己定)。然后服务器(S)要有个储存器(可以是哈希表或者是类数组)保存客户端连接句柄以及一些必要属性,还要有个时间,用来对比C每次ping的时间是否超过设定超时时间。如果超时就将C的Sock 句柄清除。到这S端就可以了。C端还要有个断线处理,监视检测自己是否断线,做个重连机制,这样一个完整的通讯就差不多了,至于其他应用就要看自己的需要通过协议来操作了。 希望这些能帮到你
漫妙幽离

2024-09-21 13:50:13

Socket连接不在通讯状态的时候监测是否连接良好就没有什么意义了,也就是说在传输数据的时可能连接会异常断开,这时候测试连接的线程肯定不可能在运行中(监测线程的优先级不可能比传输数据线程的优先级高),除非把优先级设得比较高,如果这样的话就太浪费资源了。
需要在Socket连接不在使用中时仍然保持连接,比较折衷的办法是:
其一,建立一个低优先级的监视线程,用来保持非通讯状态的连接完好。
其二,用try...catch...来维持通讯过程中的连接良好(一旦通讯异常立即重新连接)。