代码之家  ›  专栏  ›  技术社区  ›  Tomasz Szymański

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

  •  0
  • Tomasz Szymański  · 技术社区  · 12 年前

    我的代码有个大问题。或使用系统。以下是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 framework

    • 关闭windows防火墙和AV

    • 将目标框架更改为以前的版本(3、3.5)

    不幸的是,无法重新安装操作系统。我必须在我的系统上实现这一点,但我已经没有选择了。我甚至不知道是什么导致了这个问题。我还能查什么?

    1 回复  |  直到 12 年前
        1
  •  1
  •   Haney    12 年前

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

    推荐文章