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 并使用它来发送所有线路,或者您必须创建 StreamWriters 并将 leaveOpen 标志设置为 true - 这允许您可以 Dispose 他们没有意外地处理 TcpClient

这并没有直接回答为什么没有收到额外的行。我可能猜想它必须在 StreamWriter 内部进行缓冲,直到流被处理后才完全刷新。所以我会尝试 Dispose the StreamWriters and/or 只创建一个。或者另一边的接收端工作不正常?在那种情况下,最简单的方法是使用 Wireshark、tcpdump 或 strace 检查真正写入套接字的内容。

客户端正在 Unity 中侦听一个名为 Update() 的函数,该函数在每一帧都被调用。如果发送两次,第二个数据将在两帧之间发送,无法接收。 thread.sleep 是必要的。