我试图用简单的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,并且循环将停止。我究竟做错了什么?
我真的很感谢您的帮助。提前致谢。
您正在阅读流的末尾-但是,只有关闭发送套接字后,这种情况才会发生。在套接字关闭之前,它处于Read
不确定的挂起状态,并且正确且预期它将无限期地阻塞,直到以下一种情况为止:
顺便说一句,您正在丢弃读取的第一部分数据。如果您可以关闭发送流,则应将所有代码替换为:
using(var fs = File.Create(path_to_recieved_file)) {
client.GetStream().CopyTo(fs);
}
但是,如果您无法关闭发送流(例如,因为要发送多个消息),则需要实现某种成帧协议-例如,为数据加上有效载荷长度作为前缀。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句