【问题标题】:c# app stops responding on recieving file over tcpc# app 在通过 tcp 接收文件时停止响应
【发布时间】:2014-05-28 21:00:59
【问题描述】:

我试图用简单的 tcp 服务器接收 xml 文件。但我所有的努力都以从 NetworkStream 读取字节的应用程序结束。我不知道,有什么问题。

我已经尝试将源代码从答案复制到非常similar question。它看起来应该可以工作,但它没有

我的客户端发送xml的代码示例:

private void SendFile()
{
    // stm is a class attribue NetworkStream defined in another method 
    byte[] dataToSend = File.ReadAllBytes(string_path_to_file);             
    stm.Write(dataToSend, 0, dataToSend.Length);
    sstm.Flush();
}

我的服务器接收 xml 的代码示例:

 public void RecieveFile()
    {
            Stream fs = new FileStream(path_to_recieved_file, FileMode.Create, FileAccess.ReadWrite);
            Byte[] bytes = new Byte[1024];
            int length;
            //client was defined earlier, on establishing connection
            NetworkStream networkStream = client.GetStream();
            length = networkStream.Read(bytes, 0, bytes.Length);

            while ((length = networkStream.Read(bytes, 0, bytes.Length)) != 0)
            {
                  fs.Write(bytes, 0, length);
            }  
    }

客户端工作正常。我正在发送测试 xml 文件(~533b),服务器可以读取这些数据。当我调试我的应用程序时,我可以看到第一次服务器将读取 533b(显然,整个文件)。然后写入它并在尝试第二次读取后停止响应。我希望在第二次阅读之后,当 networkStream 中没有任何内容时,我会得到 length=0 并且循环将停止。我做错了什么?

我非常感谢任何帮助。提前致谢。

【问题讨论】:

    标签: c# tcp


    【解决方案1】:

    您正在读取到流的末尾 - 但是,在您关闭发送套接字之前不会发生这种情况。直到套接字关闭,它处于一个边缘挂起状态,并且正确并且预期Read 将无限期阻塞,直到出现以下情况之一:

    • 流关闭(或出现故障)
    • 至少有一个字节可用
    • 读取超时(如果启用)

    顺便说一句,您正在丢弃您读取的第一块数据。如果您可以关闭发送流,则应该将所有代码替换为:

    using(var fs = File.Create(path_to_recieved_file)) {
        client.GetStream().CopyTo(fs);
    }
    

    但是,如果您不能关闭发送流(例如,因为您想发送多条消息),您将需要实现某种帧协议 - 例如,在数据前面加上前缀有效载荷长度。

    【讨论】:

    • 哦...不知道,我现在必须关闭它。感谢!如果客户端将文件大小发送到服务器并且仅在此之后发送整个文件,它会有所帮助吗?所以服务器只会读取预期的字节数?
    • @Mad 你能改写一下吗?我无法理解这个问题。
    • 1) 客户端将发送文件的大小 2) 之后客户端将使用我的 SendFile() 方法发送文件 3) 服务器将收到已提取文件的大小 4) 服务器将只读取预期的字节数.因此,当长度等于文件的预期大小时,我将能够停止读取循环。
    • @Mad 可以工作,但这不是您发布的代码的作用
    • 是的,我知道。我会尝试修复它。至少现在我知道我的问题是什么。谢谢!真的很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 2015-10-22
    • 2020-08-02
    • 2012-11-11
    • 1970-01-01
    • 2015-03-26
    相关资源
    最近更新 更多