现为一个小公司做了一个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)
我已经将客户端发送消息的时候,将发消息所在的线程睡了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)
解决方案 »
- string.format 问题
- 再求--如何在后台得到Label控件的Text值
- wf 出现Title: Index was outside the bounds of the array.问题,与持久化服务有关吗?
- 数据访问,实体类用class还是struct
- 数据库数据写入问题
- C#入门问题
- 获取目录里的文件路径(多个)后需要与表字段比较,如何操作好?
- 如何为WebBrowser设置一个独立于系统的Cookie,或者截获WebBrowser中发出的Get/Post请求并且自己处理Http头以附加上Cookie
- 在C#中怎样设置日期格式?
- C 语言画图程序
- 求助:建立了一个Smart Device项目,发现我的Emulator不支持中文。
- 怎么把日期格式变成 XXXX-XX-XX XX:XX:XX
可以看看服务器上是否有开防火墙,关掉试试另外在客户端对socket发送加try,避免影响后面的程序运行
catch(IOException ex)
{
if(IOException.InnerException is System.Net.Sockets.SocketException)
Console.WriteLine("网络中断");
else
Console.WriteLine(ex.Message);
}
你好,。
1. 我这里抛的异常是在服务器端的。
2. 这个异常是在移植到主页服务器后,才出现的。在开发机器上是没有的。
对 sj97a007:
1.服务器和客户端的防火墙都是关闭的。
2.客户端发送消息,没有出现任何异常。 而且发送完毕后,发送消息的线程会睡20秒。
客户端是 windows7 和 windows xp这个异常也不是每次都会出现。
只是移植后出现的频率比较高。。
睡30秒?我觉得睡0.1秒都是浪费社会资源。通讯不是这样的,不需要睡。如果有人跟你说你客户端发送太快了所以出错,那么可以肯定是你的服务器端软件设计有基本的概念错误,而不是人家socket有问题。比如说在一些有ARP攻击(比如有人喜欢玩“BT终结者”软件)或者路由器连接有故障的网络上,服务器可能在收到一个buffer数据之后,暂时地缓冲区中没有数据,可是紧接着buffer就又能收到数据了。这时候,你如何判断一个消息结束?如果你没有等待业务上定义的消息结束符号,而仅仅根据buffer中没有数据了就认为客户端发送完了,那么服务器就会提前胡乱解析未完的数据甚至关闭连接了。
就按照我现在的这种思路,为什么会出现这种问题呢?
服务器 死循环来接受连接。 也就是每次客户端发送一个消息我都用一个连接。服务器在循环中,每接到一个客户端的链接,处理完消息后就关掉了循环中接收到得socket,然后继续AcceptSocket可能这样设计有问题吧,本来是这样想的:在客户端连接服务器后,服务器保存Socket对象,然后每次服务器返回消息的时候,都通过这个socket连接,客户端也就可以一直都用一个连接了,但是开始实现起来的时候,除了比较多的问题,没有找到解决方案。然后就一直用这种比较笨的方法。
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();客户端自始至终没法出现异常。
lz不理睬了啊
又是一个无法解决的问题