当前位置: 代码迷 >> C# >> Socket服务端封锁后报错:远程服务端已关闭。
  详细解决方案

Socket服务端封锁后报错:远程服务端已关闭。

热度:50   发布时间:2016-05-05 04:29:55.0
Socket服务端关闭后报错:远程服务端已关闭。。。
目前客户端和服务端均是循环发送和接收命令,服务器先开启后,客户端输入命令,服务器再回传给客户端,现在遇到的问题是,在两端均循环发送和接收的同时,若关闭服务器端,出错,代码如下,帮忙分析下:

客户端发送数据的一个方法:

 public void SendMessage(string msg) //发送数据到主机
        {

            try
            {
                tcpClient = new TcpClient();
                tcpClient.Connect(new IPAddress(bytes), servetPort); //将客户端连接到主机
                if (tcpClient.Connected)
                {
                    flag = true;
                }
                if (flag)
                {
                   // tcpClient = new TcpClient();
                   // tcpClient.Connect(new IPAddress(bytes), servetPort); //将客户端连接到主机
                    streamToServer = tcpClient.GetStream();
                    byte[] buffer = Encoding.Unicode.GetBytes(msg);
                    streamToServer.Write(buffer, 0, buffer.Length); //发往服务器   
                }
               
               
            }
            catch (Exception)
            {
                try
                {
                    streamToServer.Close();
                    tcpClient.Close();
                }
                catch (Exception)
                {
                    // ignored
                }

                // ignored
            }
        }




接收数据的方法:
 public string ReceiveMessage()
        {
           // byte[] buffer = streamToServer.ReadByte();
            byte[] buffer = new byte[BufferSize];
            int bytesRead = 0;
            while (true)
            {            
                try
                {
                    if (flag)
                    {
                        Thread.Sleep(200);
                            lock (streamToServer)
                            {
                                    bytesRead = streamToServer.Read(buffer, 0, buffer.Length); 
                            }        
 
                  
                    }

                }
                catch (System.Net.Sockets.SocketException ex)
                {

                    MessageBox.Show(ex.ToString());

                    // ignored
                }
                streamToServer.Close();
                string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
                return msg;
            }

------解决思路----------------------
很正常啊,这有什么不对吗

客户端正在发送或接收,对方断开了,还不报错,那不更有问题了

你catch里怎么只指定了一种错误类型?
至少还要再加个catch,捕捉其它错误类型,而不是有错误就直接挂 了
------解决思路----------------------
很正常,在catch里面处理
------解决思路----------------------
而且错误信息已经提示的很明显了
新错误是IOException,而不是SocketException
------解决思路----------------------
如果连对方断开了,程序都捕捉不到,还正常的发送接收,你才应该苦恼
------解决思路----------------------
不是已经提示的很明显了,是System.IO.IOException类型的异常
------解决思路----------------------
catch (System.IO.IOException ex1)
                {
                    MessageBox.Show("服务器已关闭");
                }
只声明类型,不声明变量,不会报错?

即使加了这个,你还应该在最后加上
catch(Exception ex)//捕获所有类型的异常
------解决思路----------------------
加上catch(Exception ex)也捕捉不到?
看下VS设置里,是否设置了断点在未捕捉的异常,还是设置了断点在所有异常
------解决思路----------------------
调试->异常->
看到底是否选择了"引发",还是只选择了"用户未处理的"

如果选择了引发,那么即使异常已经处理,那么依然会停在出错的代码行.
你在catch里设置断点,看出错之后,最终到底是否能走进catch里
------解决思路----------------------
你看,引发里一大堆挑

没动过不代表设置的没有问题

每个工程,这个选项都不一样的,并不是在VS里设置一次所有工程都跟着变

也许是你copy过来的这个工程,当初人家就是这么设置的
------解决思路----------------------
我这里有05,08,10,没安装12
你把引发的那些挑都去掉试试呗

或者像我说的,停了不要紧,看最终是否能走进catch里,还是按F5不往下走了
如果能往下走,不影响你最终发布执行的
------解决思路----------------------
还是把引发都关了吧
------解决思路----------------------
引用:

client.cs,行号157,try catch不到?
------解决思路----------------------
你客户端建立链接后似乎没有主动断开?
  相关解决方案