C# TcpClient - 对 StreamWriter 的后续调用仅写入第一个
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);
客户端只收到第一行。我在 SendData() 方法中添加了一个 Thread.Sleep(100),如下所示:
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
并使用它来发送所有线路,或者您必须创建 StreamWriter
s 并将 leaveOpen
标志设置为 true - 这允许您可以 Dispose
他们没有意外地处理 TcpClient
。
这并没有直接回答为什么没有收到额外的行。我可能猜想它必须在 StreamWriter
内部进行缓冲,直到流被处理后才完全刷新。所以我会尝试 Dispose the StreamWriters and/or 只创建一个。或者另一边的接收端工作不正常?在那种情况下,最简单的方法是使用 Wireshark、tcpdump 或 strace 检查真正写入套接字的内容。
客户端正在 Unity 中侦听一个名为 Update() 的函数,该函数在每一帧都被调用。如果发送两次,第二个数据将在两帧之间发送,无法接收。 thread.sleep 是必要的。
我有一个 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);
客户端只收到第一行。我在 SendData() 方法中添加了一个 Thread.Sleep(100),如下所示:
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
并使用它来发送所有线路,或者您必须创建 StreamWriter
s 并将 leaveOpen
标志设置为 true - 这允许您可以 Dispose
他们没有意外地处理 TcpClient
。
这并没有直接回答为什么没有收到额外的行。我可能猜想它必须在 StreamWriter
内部进行缓冲,直到流被处理后才完全刷新。所以我会尝试 Dispose the StreamWriters and/or 只创建一个。或者另一边的接收端工作不正常?在那种情况下,最简单的方法是使用 Wireshark、tcpdump 或 strace 检查真正写入套接字的内容。
客户端正在 Unity 中侦听一个名为 Update() 的函数,该函数在每一帧都被调用。如果发送两次,第二个数据将在两帧之间发送,无法接收。 thread.sleep 是必要的。