[英]C# TcpClient - Subsequent calls to StreamWriter only write the first one
我有一个TCP连接和一个StreamWriter。
public void SendData(string data, TcpClient client)
{
StreamWriter writer = new StreamWriter(client.GetStream());
writer.WriteLine(data);
writer.Flush();
}
当我随后像这样调用SendData()时
SendData("hi", client);
SendData("how are you", client);
SendData("?", client);
客户只收到第一行。 我将Thread.Sleep(100)添加到SendData()方法中,如下所示:
public void SendData(string data, TcpClient client)
{
StreamWriter writer = new StreamWriter(client.GetStream());
writer.WriteLine(data);
writer.Flush();
Thread.Sleep(100);
}
第二种情况很好。 您认为我的解决方案是否可以接受,还是应该尝试更改客户? 您对这个问题的根源有任何经验或想法吗?
通常,您不应在单个TcpClient/NetworkStream
之上创建多个StreamWriters。 正如您在StreamWriter
的文档中所看到的那样,它期望获得包装的Stream
所有权,并在Dispose
StreamWriter
后将对其调用Dispose
。 您应该只创建一个StreamWriter
并使用它发送所有行,或者必须将leaveOpen
标志设置为true来创建StreamWriter
,这使您可以Dispose
它们而不会意外处置TcpClient
。
这不能直接回答为什么没有收到其他行的原因。 我可能会猜测它必须对StreamWriter
内部的缓冲进行某些处理,直到处理完流之后,该缓冲才会被完全刷新。 因此,我将尝试处置StreamWriters和/或仅创建一个。 还是另一侧的接收无法正常工作? 在这种情况下,最简单的方法是使用Wireshark,tcpdump或strace检查真正写入套接字的内容。
客户端正在Unity中通过一个称为Update()的函数进行侦听,该函数在每一帧都被调用。 如果发送两次,则第二个数据将在两个帧之间发送,无法接收。 thread.sleep是必需的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.