【问题标题】:C# TcpClient - Subsequent calls to StreamWriter only write the first oneC# TcpClient - 对 StreamWriter 的后续调用只写入第一个
【发布时间】:2017-08-13 21:23:27
【问题描述】:

我有一个 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);
}

第二种情况完全正常。你认为我的解决方案可以接受还是我应该尝试改变客户?您对这个问题的根源有什么经验或想法吗?

【问题讨论】:

  • 你可以试试using(var writer = new StreamWriter(client.getStream())){SendData("Hi",write);SendData("How are you?",writer);SendData("?",writer);}吗?
  • 在 writer 上调用 Dispose() 并销毁底层流。遗憾的是不是 tcp 连接的选项
  • :( 是的,如果您也在其他地方使用它或者以后需要它。但是您可以尝试在外部创建StreamWriter 并按照建议传递给SendData @Matthias247,它只会创建一个作家。
  • 这是一个很好的约定,我实现了它。感谢您的帮助,但问题仍然没有改变。

标签: c# multithreading tcpclient streamwriter


【解决方案1】:

您通常不应在单个 TcpClient/NetworkStream 之上创建多个 StreamWriter。正如您在StreamWriter 的文档中看到的那样,它希望获得已包装的Stream 的所有权,并在您Dispose StreamWriter 时调用Dispose。您应该只创建一个 StreamWriter 并使用它来发送您的所有行,或者您必须创建 StreamWriters 并将 leaveOpen 标志设置为 true - 这允许您可以 Dispose 他们无需处置TcpClient 不小心。

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

【讨论】:

  • 感谢您的解释。我相应地更改了代码,它看起来更干净。但问题仍然存在。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-02-12
    • 2016-08-11
    • 2017-05-10
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多