C#TcpClient - 对StreamWriter的后续调用只写第一个

时间:2017-03-21 23:38:33

标签: c# multithreading tcpclient streamwriter

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

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

2 个答案:

答案 0 :(得分:1)

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

这并没有直接回答为什么没有收到额外的行。我可能会猜测它必须在TcpClient内部进行缓冲,而不是完全冲洗,直到流被丢弃。所以我会尝试Dispose StreamWriters和/或只创建一个。或者另一方的接待可能无法正常工作?在这种情况下,最简单的方法是使用Wireshark,tcpdump或strace检查真正写入套接字的内容。

答案 1 :(得分:0)

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