打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C# Socket异步编程,重启服务器,客户端连接不上,怎么办?
 
蓝星星回复于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分 
你所陈述的并不是你代码的问题,而是解决这种异常状况的思路问题,
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
一封给“X教授”的回信(讨论Socket通信)
在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分-.NET教程,C#语言
C#编写高性能网络服务器(源码)
TCP三次握手/四次挥手
让Ubuntu和Android同时运行(Ubuntu on Android)
译文:如何使用SocketAsyncEventArgs类(How to use the SocketAsyncEventArgs class)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服