现为一个小公司做了一个C\S管理程序, 通过Socket 通信,在开发机器上测试时,一切正常(服务器和客户端都在同一台开发主机上)。但是当将服务器端移植到专门的主机上后, 服务器端经常出现该异常。
我已经将客户端发送消息的时候,将发消息所在的线程睡了30秒。 但还是出现这样的问题。
请问这是不是 那个服务器所在的主机系统主动将我的服务器端与客户端通信的连接关闭?
请问这需要怎么结局?
System.IO.IOException: 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。。 ---> System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接。
   在 System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   --- 内部异常堆栈跟踪的结尾 ---
   在 System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   在 System.IO.BinaryReader.ReadBytes(Int32 count)
   在 System.Runtime.Serialization.Formatters.Binary.SerializationHeaderRecord.Read(__BinaryParser input)
   在 System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadSerializationHeaderRecord()
   在 System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
   在 System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
   在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
   在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, IMethodCallMessage methodCallMessage)

解决方案 »

  1.   

    在和设备通信的时候遇到过,结果是设备那端解决的,也就是socket的服务器端
    可以看看服务器上是否有开防火墙,关掉试试另外在客户端对socket发送加try,避免影响后面的程序运行
      

  2.   

    server 端关闭,client端依然在读取数据 所以引发异常
    catch(IOException ex)
    {
       if(IOException.InnerException is System.Net.Sockets.SocketException)
           Console.WriteLine("网络中断");
       else
           Console.WriteLine(ex.Message);
    }
      

  3.   


    你好,。
    1. 我这里抛的异常是在服务器端的。
    2. 这个异常是在移植到主页服务器后,才出现的。在开发机器上是没有的。
    对 sj97a007:
    1.服务器和客户端的防火墙都是关闭的。
    2.客户端发送消息,没有出现任何异常。 而且发送完毕后,发送消息的线程会睡20秒。
      

  4.   

    我这里的服务器时 windows server 2008 64位系统。
    客户端是  windows7 和 windows xp这个异常也不是每次都会出现。
    只是移植后出现的频率比较高。。
      

  5.   


    睡30秒?我觉得睡0.1秒都是浪费社会资源。通讯不是这样的,不需要睡。如果有人跟你说你客户端发送太快了所以出错,那么可以肯定是你的服务器端软件设计有基本的概念错误,而不是人家socket有问题。比如说在一些有ARP攻击(比如有人喜欢玩“BT终结者”软件)或者路由器连接有故障的网络上,服务器可能在收到一个buffer数据之后,暂时地缓冲区中没有数据,可是紧接着buffer就又能收到数据了。这时候,你如何判断一个消息结束?如果你没有等待业务上定义的消息结束符号,而仅仅根据buffer中没有数据了就认为客户端发送完了,那么服务器就会提前胡乱解析未完的数据甚至关闭连接了。
      

  6.   

    如果不太有把握进行tcp通讯,还是先使用web service或者wcf吧。这两种是比较傻瓜化的,比较可靠。
      

  7.   


    就按照我现在的这种思路,为什么会出现这种问题呢?
    服务器 死循环来接受连接。 也就是每次客户端发送一个消息我都用一个连接。服务器在循环中,每接到一个客户端的链接,处理完消息后就关掉了循环中接收到得socket,然后继续AcceptSocket可能这样设计有问题吧,本来是这样想的:在客户端连接服务器后,服务器保存Socket对象,然后每次服务器返回消息的时候,都通过这个socket连接,客户端也就可以一直都用一个连接了,但是开始实现起来的时候,除了比较多的问题,没有找到解决方案。然后就一直用这种比较笨的方法。
      

  8.   

    这是 服务器监听代码:
                    listener = new TcpListener(Ipaddress, Port);
                    listener.Start();
                    while (temp)
                    {
                        
                        try
                        {
                            Socket socket = listener.AcceptSocket();
                            NetworkStream readStream = new NetworkStream(socket);
                            BinaryFormatter readBf = new BinaryFormatter();
                            readMessage = (byte[])readBf.Deserialize(readStream);//抛异常在这里。
                            sendMessage(readMessage);// 这里起线程来处理消息
                        }
                        catch (SocketException sEx)
                        {
                            Log4NetUtil.Log4NetU.Log.Debug(sEx.Message, sEx);
                        }
                        catch (Exception ex)
                        {
                            
                            Log4NetUtil.Log4NetU.Log.Debug("发生异常啦……", ex);                    }
                    }
    这里是客户端代码:                sendTcpClient = new TcpClient(ipaddress, port);
                    
                    sendNetworkStream = sendTcpClient.GetStream();
                    BinaryFormatter bf = new BinaryFormatter();
                    bf.Serialize(sendNetworkStream, message);
                    sendNetworkStream.Flush();
                    Thread.Sleep(30000);
                    sendNetworkStream.Close();
                    sendTcpClient.Close();客户端自始至终没法出现异常。
      

  9.   

    遇到同样的问题啊 不过我客户端是用flex作的  一直找不到原因 准备改成webservice了 
      

  10.   

    o(︶︿︶)o 唉
    lz不理睬了啊
    又是一个无法解决的问题