C# Socket断线重连问题

小月还小 2018-09-20 04:53:15
其实这个问百度一搜一大堆 。但是没有 找到我要的答案 ,现在的问题是服务端断开连接后 , 客户端就每间隔10秒去重连一次 ,然后等服务端回复连接时,会出现现下面这种情况,这是为什么 ,怎么解决 ,拜托各大佬给个思路
...全文
1183 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
小月还小 2018-10-03
  • 打赏
  • 举报
回复
引用 7 楼 sp1234 的回复:
通常,(使用条件编译使得仅仅在 Release 版本)可以在类似 AppDomain.CurrentDomain.UnhandledException 之类的事件处理代码中去打印 exception 的详细日志(包括堆栈信息),以便了解抛出异常的具体语句到底是哪一行。如果软件系统彻底崩溃,打印不出来上述信息,那么你至少可以在日志中用不同的日志来”逼近“抛出异常的语句。 一直,搞不清楚具体是哪一行代码抛出异常,这就不算是搞开发。
谢谢大佬的指点 , 我会努力进步成为真正的开发者的 , 我的问题已经解决了,谢谢咯
  • 打赏
  • 举报
回复
你说”我重置系统,然后让程序死机10秒钟,然后重连”,你把这个当作“正常的”业务控制逻辑。这时候你就丧失99%的了调试能力。 开发中是要让 BUG 尽早跳出来,并且在正常的流程中写代码去预先 if 判断处理。绝不是把 try...catch 当作一个正常的业务流程来用! 不是像一个鸵鸟一样把头埋在沙子里,来糊弄自己!
  • 打赏
  • 举报
回复
引用 2 楼 w5s2g0_zxy 的回复:
[quote=引用 1 楼 chb345536638 的回复:] 异常没被捕获,直接挂掉了呗
捕捉了啊 。 是请求太多才会这样 吧[/quote] 所谓”捕捉异常“这往往是一个开发过程的 BUG。开发中就是要让异常尽早跳出来,跳到 vs 调试器中,所以胡乱写 try....catch 是错误的,你写了 try.....catch 可能你就丧失了调试能力。这个问题只有等你真正贴出抛出异常的语句,并且学会 vs 的调试器怎么直接调试抛出异常的语句,就明白了。可以说,胡乱写 try...catch 其实你学的不是很正规有经验的开发,而是你的老师让你”自学“开发的做法。 只有程序的发布版本(Release编译版本)才会让你自己写的 try....catch 来捕获异常,而 DEBUG 版本则会屏蔽掉 try...catch 而让 vs 调试器来捕获异常。
  • 打赏
  • 举报
回复
通常,(使用条件编译使得仅仅在 Release 版本)可以在类似 AppDomain.CurrentDomain.UnhandledException 之类的事件处理代码中去打印 exception 的详细日志(包括堆栈信息),以便了解抛出异常的具体语句到底是哪一行。如果软件系统彻底崩溃,打印不出来上述信息,那么你至少可以在日志中用不同的日志来”逼近“抛出异常的语句。 一直,搞不清楚具体是哪一行代码抛出异常,这就不算是搞开发。
EricBBB 2018-09-29
  • 打赏
  • 举报
回复
你这个持续Catch异常一直Sleep,卡死了吧。
小月还小 2018-09-20
  • 打赏
  • 举报
回复
你用表情也太可爱啦 !! 这里是因为接受服务端的消息就是相当于监听(我是这么认为的), 所以我就把重连的方法写在Catch里 ,当我服务端再次连接上的时候,那么就是上面那个错啦
小月还小 2018-09-20
  • 打赏
  • 举报
回复
引用 3 楼 chb345536638 的回复:
[quote=引用 2 楼 w5s2g0_zxy 的回复:] [quote=引用 1 楼 chb345536638 的回复:] 异常没被捕获,直接挂掉了呗
捕捉了啊 。 是请求太多才会这样 吧[/quote] 你点开那个问题详细信息里面什么内容吧,或者直接上代码吧[/quote]
  ///<summary>  
        ///接收消息  
        ///</summary>  
        private void ReceiveMessage()
        {
            //Socket socketClient = socketClientPara as Socket;
            while (true)
            {
                 try
                    {
                //接受消息头(消息校验码4字节 + 消息长度4字节 + 身份ID8字节 + 主命令4字节 + 子命令4字节 + 加密方式4字节 = 28字节)  
                int HeadLength = 28;
                //存储消息头的所有字节数  
                byte[] recvBytesHead = new byte[HeadLength];
                //如果当前需要接收的字节数大于0,则循环接收  
                if (HeadLength > 0)
                {
                   
                        byte[] recvBytes1 = new byte[28];
                        //将本次传输已经接收到的字节数置0  
                        int iBytesHead = 0;
                        //如果当前需要接收的字节数大于缓存区大小,则按缓存区大小进行接收,相反则按剩余需要接收的字节数进行接收  
                        if (HeadLength >= recvBytes1.Length)
                        {
                            iBytesHead = socketClient.Receive(recvBytes1, recvBytes1.Length, 0);
                        }
                        else
                        {
                            iBytesHead = socketClient.Receive(recvBytes1, HeadLength, 0);
                        }
                        //将接收到的字节数保存  
                        recvBytes1.CopyTo(recvBytesHead, recvBytesHead.Length - HeadLength);
                        //减去已经接收到的字节数  
                        HeadLength -= iBytesHead;

                        //接收消息体(消息体的长度存储在消息头的4至8索引位置的字节里)  
                        byte[] bytes = new byte[4];
                        Array.Copy(recvBytesHead, 4, bytes, 0, 4);
                        int BodyLength = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(bytes, 0));
                        //存储消息体的所有字节数  
                        byte[] recvBytesBody = new byte[BodyLength];
                    //如果当前需要接收的字节数大于0,则循环接收  
                        if (BodyLength > 0)
                        {
                            byte[] recvBytes2 = new byte[BodyLength < 1024 ? BodyLength : 1024];
                            //将本次传输已经接收到的字节数置0  
                            int iBytesBody = 0;
                            //如果当前需要接收的字节数大于缓存区大小,则按缓存区大小进行接收,相反则按剩余需要接收的字节数进行接收  
                            if (BodyLength >= recvBytes2.Length)
                            {
                                iBytesBody = socketClient.Receive(recvBytes2, recvBytes2.Length, 0);
                            }
                            else
                            {
                                iBytesBody = socketClient.Receive(recvBytes2, BodyLength, 0);
                            }
                            //将接收到的字节数保存  
                            recvBytes2.CopyTo(recvBytesBody, recvBytesBody.Length - BodyLength);
                            //减去已经接收到的字节数  
                            BodyLength -= iBytesBody;
                        }
                        //一个消息包接收完毕,解析消息包  
                        UnpackData(recvBytesHead, recvBytesBody);
                }
                    }
                 catch (Exception)
                 {

                     txtMsg.AppendText("服务端已经断开连连接");
                   //重连的方法
                   ContentServer();
                     
                     Thread.Sleep(10000);
                     
                 }
               
               
            }
        }
  • 打赏
  • 举报
回复
引用 2 楼 w5s2g0_zxy 的回复:
[quote=引用 1 楼 chb345536638 的回复:] 异常没被捕获,直接挂掉了呗
捕捉了啊 。 是请求太多才会这样 吧[/quote] 你点开那个问题详细信息里面什么内容吧,或者直接上代码吧
小月还小 2018-09-20
  • 打赏
  • 举报
回复
引用 1 楼 chb345536638 的回复:
异常没被捕获,直接挂掉了呗
捕捉了啊 。 是请求太多才会这样 吧
  • 打赏
  • 举报
回复
异常没被捕获,直接挂掉了呗

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧