蓝星星回复于30日14点55分 晕倒,都说了啊,解决办法就是在每次收到一个包以后,发送一个0字节空包,发的出去就说明没断,发不出去就会出现“远程主机强行关闭了一个连接”的异常,扑获这个异常就可以了,断开,等待重连,接下来什么的就是你的事了 另外我问下你,在服务端断开以后,客户端的CPU是不是一直处于100%的状态?如果是的话,那么这个办法绝对可以解决的! |
冷光乾回复于30日15点34分 我的问的是怎么连呀,不是问怎么知道服务器断了!能写一个异步连接的方法吗? |
好子娘回复于30日16点13分 至于断开以后怎么重连,晕死,你第一次怎么连后面就怎么连啊,比如说断开以后,就进入一个循环,来循环进行连接,如果连接成功,那么跳出这个循环,开始进入另一个循环来接受数据 |
xiaoxue9757回复于30日16点56分 SOCKET一直就有这个问题,服务端断开以后,相信你的客户端的CPU一直处于100%,因为再不停的无限循环的接受一个0字节包 解决办法就是发送心跳包,或者每收到一个包,就发送一个0字节包,断开了的话就会异常 |
家有大宝回复于30日17点37分 关注。呵呵 |
dd970322回复于30日18点14分 可能是你的 客户端 没有 收到断开连接的 信息。 这个需要在通信 协议里面 加个 心跳 报文, 每隔多少时间 收不到 就 断开 重连 |
潇湘紫藤回复于30日18点57分 我刚才找到一种方法,但是不是知道是不是最好的,就是在我的方法里面把Socket重新生成一个 _Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); |
tianyi回复于30日19点42分 其实主要的问题是服务端如果是强制断开,也就是物理断开或者直接结束了进程这种断开,客户端是接收不到断开请求的,也就是说这个时候的客户端并不认为断开了,而且客户端还在不停的接受一个0字节的数据包,无限循环,所以还会导致客户端的CPU一直处于100%的状态 这个问题我之前写一个C/S通讯程序的时候碰到过,解决办法找了一天都是些非常麻烦的方案,于是我自己想了个办法,就是在每次接受数据的时候,发送一个0字节包,这样的话服务端如果断开,那么客户端就会开始无限循环接受一个0字节包,那么再接受以后,按我说的方案,还会在返回一个0字节包,但是肯定无法发送,所以会异常,扑获就OK了!! 客户端代码: '接受数据,收到后返回一个垃圾包 XXX.Send(Encoding.Unicode.GetBytes("0")) '垃圾包 '如果服务端已断开,那么肯定发不出去,结果异常,扑获就行了,VB中是TRY,C#就不知道了 |
sr2008回复于30日20点27分 先开客户端 这时候服务器没开 连接语句已经执行 以后当然就连不上了 应该加个连接检测 如果发现没连上或断开后多少时间自动重连接 |
急也没用回复于30日21点08分 你第一次怎么连就是怎么连。。。 |
lw334554回复于30日21点54分 网罗编程我关注 |
神行鼠回复于30日22点37分 我问的就是怎么重连呀? 我专门写了一个重连函数,第一次(服务器先启动的情况),用这个函数是可以连的,然后我把服务器关闭再开启,就连不上去了,说远程主机强行关闭了一个连接。 还有一种情况是,我先开客户端,这个时候客户端处于一直连接状态,等我开了服务器就立马连上了,在重启服务器又连不上了。 我的重连函数是: /// <summary> /// 异步连接 /// </summary> private void ReConnectAsync() { SocketAsyncEventArgs ConnectAsyncEvent = new SocketAsyncEventArgs(); ConnectAsyncEvent.Completed += new EventHandler <SocketAsyncEventArgs>(ConnectAsync_Completed); ConnectAsyncEvent.UserToken = _Socket; ConnectAsyncEvent.AcceptSocket = _Socket; ConnectAsyncEvent.RemoteEndPoint = GetEndPont(); //开始连接事件 CallEvent(OnConnecting, this, new EventArgs()); //异步连接 try { //重连次数增加 _RetryCount++; if (!_Socket.ConnectAsync(ConnectAsyncEvent)) { if (!Connected) {//没连接继续连 AutoConnectMeoth(); } } //在异步连接完的回调方法(ConnectAsync_Completed)里面开始异步接收 } catch { if (_DebugMode) { throw; } } } |
爱咋咋的回复于30日23点14分 1.tcp/ip 服务器中断客户端肯定是会得到通知,但是这个时候你可以通过timer来循环桥接。如果是FLASH SOCKET那可以通过JS来进行循环桥接。 2.UDP/IP 由于是无链接的,所以需要通过心跳包来进行报文监测。客户端接受心跳包报文超过设定的心跳时间间隔,那就尝试循环尝试是否存在服务器,如果心跳包报文仍能按照间隔发包,那就证明已经在链接状态中。。。 |
滴滴嘟嘟回复于31日02点47分 你所陈述的并不是你代码的问题,而是解决这种异常状况的思路问题, |
联系客服