我有一个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);
}
第二种情况完全正常。您认为我的解决方案是可以接受的还是我应该尝试更改客户端?你对这个问题的根源有什么经验或想法吗?
答案 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是必要的。