问题描述
sockettcp长连接现在是这样我有5000个soket每秒并行2个给服务端发数据(请求)然后服务端收到任何一个socket请求就会给我5000个socket每个发数据(通知)下行很大我发的请求很小只有60字节服务端给我每个socket的回复是79字节服务器端是分布式的是多个服务器不是服务端的问题现在是我socket连接后一旦我发请求socket就会在下次send时提示远程主机强迫关闭或者提示本机主动放弃我收用的是Receive发用的是send知道为什么掉吗?HearBeat2:System.Net.Sockets.SocketException(0x80004005):您的主机中的软件放弃了一个已建立的连接。在System.Net.Sockets.Socket.Send(Byte[]buffer,Int32offset,Int32size,SocketFlagssocketFlags)在System.Net.Sockets.Socket.Send(Byte[]buffer,Int32size,SocketFlagssocketFlags)在GXBL.User.HearBeat()------------------------------------我用了多线程收和发可能不是同一个线程对了如服务器给我发消息我不收会被被断开吗?我是说我不调用Socket.Receive(clearRecv);另外我不收服务器会知道我没收吗?
解决方案
本帖最后由 u013403066 于 2014-01-07 01:04:57 编辑
解决方案二:
服务器端如果遇到向客户端发送消息失败的情况,连续几次以后(例如5次)就可以直接关闭连接了。如果你不收,会超时而抛出异常。
解决方案三:
你的所谓“服务器”程序是拿来别人的代码用,不是自己写吧?如果有源代码,就好好看看人家是如何关闭连接的。
解决方案四:
不同的人可能有不同的设计,我上面只是举一个简单的例子。比如说在我们的程序中,我们并不统计“连续5次发送失败”这个东西,而是在特定的“清理客户端连接”的过程中去清理掉那些Connected属性值为false的连接(以及虽然Connected属性为true,但是超时没有发来心跳消息的连接)。
解决方案五:
虽然没遇到过这个异常但是一般的机器也就开2000个线程超出的线程则以挂起状态存在(代码已经不在执行)如果你的客户端在少数的时候(例如100)个的时候不出现这个异常你要考虑一下是不是要用异步和用一些日志跟踪的方法调试一下
解决方案六:
你如果设置了keepalive属性,一端发而另一端不收,连续几次后,他就会自动关闭socket的
解决方案七:
我是是有2个send1个是20秒send一次另一个是500毫秒send一次send的数据都很小接受的数据很大以为服务端500毫秒给我每个socket发一个数据我是20秒收一次我把收放在了20秒send一次之前---远程强迫关闭估计是我收的不及时或者心跳不及时(心跳我是定时发了得但是不知道是不是我服务器发给我的数据过大把下行带宽占用了导致我send不出去)那么本地主动放弃时什么原因呢?