使用网络流的数据传输问题

时间:2014-03-27 18:53:31

标签: c# sockets networking networkstream

我的代码存在重大问题。或者使用系统。这是C#中的客户端代码:

TcpClient client = new TcpClient("192.168.1.254", 19999);
NetworkStream nstream = client.GetStream();
Console.WriteLine("Connected.");
Stream stream = new FileStream("test.dat", FileMode.Create, FileAccess.Write);
int counter = 0;
byte[] buffer = new byte[1024];
while ((counter = nstream.Read(buffer, 0, 1024)) > 0)
{
    stream.Write(buffer, 0, counter);
}
stream.Close();
nstream.Close();
client.Close();
Console.WriteLine("Done here.");

此应用程序适用于使用python编写的服务器。这里没有火箭科学。客户端连接,服务器立即循环发送数据直到结束并且套接字关闭。问题是,在我的机器上,这个应用程序总是停止在5 - 7 kB之后接收数据。它停止并且(如调试器所示)挂起read方法。这只发生在我的机器上(来自MSDN的Windows 7 x64,visual studio 2013 express,.net 4.5.1)。在我的机器上测试了这个应用程序,但是在Linux上,使用mono和其他一些Windows机器。无处不在,但遗憾的是不在这里。我想这是我的系统的一个问题,所以这是我到目前为止所尝试的:

  • 运行没有调试器的应用程序

  • 重新安装visual studio

  • 重新安装.NET框架

  • 关闭Windows防火墙和AV

  • 将目标框架更改为先前版本(3,3.5)

不幸的是,无法重新安装操作系统。我必须在我的系统上完成这项工作,但我已经没有选择了。我甚至不知道造成这个问题的原因。我还能检查什么?

1 个答案:

答案 0 :(得分:1)

NetworkStream.Read方法在没有可用字节的情况下调用,将阻塞,直到任一字节可用或连接关闭。因此,您可能最好还是1)设计一个协议,您可以预先知道有多少字节,然后在读取了多个字节时停止读取,或者2)在不活动超时后关闭连接。请注意,1)是正确编码的唯一方法,2)如果发生网络打嗝,将为您提供部分数据。