C#应用程序停止响应通过TCP接收文件

疯狂的

我试图用简单的tcp服务器接收xml文件。但是,我的所有努力都以粉碎应用程序来结束从NetworkStream读取字节的工作而结束。我不知道这是怎么回事。

我已经尝试将源代码从答案复制到一个非常类似的问题看起来应该可以,但是不起作用

我的客户端发送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中没有任何内容时,我的长度将为= 0,并且循环将停止。我究竟做错了什么?

我真的很感谢您的帮助。提前致谢。

马克·格雷维尔(Marc Gravell)

您正在阅读流的末尾-但是,只有关闭发送套接字后,这种情况才会发生在套接字关闭之前,它处于Read不确定的挂起状态,并且正确且预期它将无限期地阻塞,直到以下一种情况为止:

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

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

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

但是,如果您无法关闭发送流(例如,因为要发送多个消息),则需要实现某种成帧协议-例如,为数据加上有效载荷长度作为前缀。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Java Web应用程序中发送和接收文件

使用C#通过LAN向Python发送/接收文件

从 Socket.Receive TCP C# 接收数据时应用程序崩溃

在c# mvc中从axios接收文件

从Internet下载大文件时如何阻止C#应用程序的UI变得无响应

通过 BAT 文件运行应用程序时,如何更新 C# 类中的参数?

如何通过C#应用程序在文件级别授予Windows权限?

如何模拟通过 C# Windows 窗体应用程序单击的链接,在本地生成文件?

使PHP文件只能通过我的C#应用程序访问?

C#-通过网络流接收文件阻止了WPF UI

为什么从文件中导入的 python 文件调用函数后 PyQt 应用程序停止响应?

再次运行应用程序时如何停止关闭的应用程序留下的线程?C#

VideoView通过套接字接收文件时播放文件

通过InputStream接收文件时如何检测文件结尾

Blazor Web应用程序的TCP接收器服务

如何通过Python的BaseHTTPRequestHandler类接收文件?

Java通过套接字发送和接收文件(字节[])

我无法通过lxde上的蓝牙接收文件

寻找广播解决方案并通过wifi接收文件?

通过局域网发送和接收文件

通过套接字Android / Java接收文件时出错

在超级终端上通过XModem接收文件

在 Ubuntu 20.04 上通过蓝牙接收文件

通过C#操作外部应用程序

通过C#应用程序连接到SAP

通过 C# 运行应用程序的 dll

通过SendMessage进行C#应用程序间通信

C#如何使应用程序即使在删除应用程序文件后仍继续运行

C#将文件保存在应用程序的位置