其实这个问百度一搜一大堆 。但是没有 找到我要的答案 ,现在的问题是服务端断开连接后 , 客户端就每间隔10秒去重连一次 ,然后等服务端回复连接时,会出现现下面这种情况,这是为什么 ,怎么解决 ,拜托各大佬给个思路

解决方案 »

  1.   

    捕捉了啊 。   是请求太多才会这样 吧
    你点开那个问题详细信息里面什么内容吧,或者直接上代码吧
      ///<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.   

    你用表情也太可爱啦 !!   这里是因为接受服务端的消息就是相当于监听(我是这么认为的),   所以我就把重连的方法写在Catch里 ,当我服务端再次连接上的时候,那么就是上面那个错啦
      

  3.   

    你这个持续Catch异常一直Sleep,卡死了吧。
      

  4.   

    通常,(使用条件编译使得仅仅在 Release 版本)可以在类似 AppDomain.CurrentDomain.UnhandledException 之类的事件处理代码中去打印 exception 的详细日志(包括堆栈信息),以便了解抛出异常的具体语句到底是哪一行。如果软件系统彻底崩溃,打印不出来上述信息,那么你至少可以在日志中用不同的日志来”逼近“抛出异常的语句。一直,搞不清楚具体是哪一行代码抛出异常,这就不算是搞开发。
      

  5.   

    捕捉了啊 。   是请求太多才会这样 吧所谓”捕捉异常“这往往是一个开发过程的 BUG。开发中就是要让异常尽早跳出来,跳到 vs 调试器中,所以胡乱写 try....catch 是错误的,你写了 try.....catch 可能你就丧失了调试能力。这个问题只有等你真正贴出抛出异常的语句,并且学会 vs 的调试器怎么直接调试抛出异常的语句,就明白了。可以说,胡乱写 try...catch 其实你学的不是很正规有经验的开发,而是你的老师让你”自学“开发的做法。只有程序的发布版本(Release编译版本)才会让你自己写的 try....catch 来捕获异常,而 DEBUG 版本则会屏蔽掉 try...catch 而让 vs 调试器来捕获异常。
      

  6.   

    你说”我重置系统,然后让程序死机10秒钟,然后重连”,你把这个当作“正常的”业务控制逻辑。这时候你就丧失99%的了调试能力。开发中是要让 BUG 尽早跳出来,并且在正常的流程中写代码去预先 if 判断处理。绝不是把 try...catch 当作一个正常的业务流程来用!不是像一个鸵鸟一样把头埋在沙子里,来糊弄自己!