WCF 双向通信中很奇怪的问题
最近在试着做一个聊天程序,支持私聊和群发,测试的时候发现一个很奇怪的问题。
在用户数比较多的情况下,会发现,两个人私聊没有啥问题,但如果某一个发一个群发消息的话,导致其中有一个人或者几个人的通信信道异常,一致心跳检测失败,服务器端认为此用户已掉线。但实际上我都是在一台电脑上测试,网络是正常的。
我基本思路如下:客户端主动每4s发一个心跳包,服务器端接收到包以后更新心跳检测数组。服务器端每7s检查一下心跳包的时间戳。
同时当服务器收到某个人的群发消息时,会将消息广播给所有人,我的问题就是在广播消息的时候,会导致某客户端与服务器信道异常,一致客户端收不到广播消息,同时服务器也收不到心跳消息。为啥会出现信道异常呢。
请牛人帮我分析一下,这是为啥导致的。
下面是客户端的心跳包发送线程。
private void ServerConnectionTest()
{
while (proxy != null && bConnected)
{
try
{
proxy.Update();
}
catch (Exception e)
{
if (iTrytime++ > 3)
{
bConnected = false;
return;
}
else
{
Thread.Sleep(1000);
continue;
}
}
Thread.Sleep(4000);
iTrytime = 0;
bConnected = true;
}
}
谢谢
WCF 服务器 心跳
------解决方案--------------------
人家这是重试3次,很容易理解的做法。
楼主你应该把服务端代码贴出来分析,这里显示连接中断显然是服务端引起的(可能是阻塞了),要同时分析各个方法是否在不同线程中运行,特别是双工回调时。
[解决办法]
我想要看的是那个回调部分的代码,也就是你群发消息是是如何通知所有连接的客户的,那个错误显然是群发部分引发的,导致连接中断,既然连接中断了,自然心跳包也不会去发送了。不过也因为你客户端重试部分写错了,导致连接中断的重试完全无效。你判断proxy.Update();异常就重试,但是从服务端代码来看,那个异常只可能是因为连接中断导致的,但是你重试中根本没有重新连接的代码,而是直接再次进行proxy.Update();尝试,都断开连接了,再进行proxy.Update();尝试有啥用?
至于为啥会导致连接中断,应该是那个回调函数调用中引发了异常,需要检测异常出处。