C# C TcpClient-对StreamWriter的后续调用仅写入第一个
我有一个TCP连接和一个StreamWriterC# C TcpClient-对StreamWriter的后续调用仅写入第一个,c#,multithreading,tcpclient,streamwriter,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
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.Sleep100,如下所示:
public void SendData(string data, TcpClient client)
{
StreamWriter writer = new StreamWriter(client.GetStream());
writer.WriteLine(data);
writer.Flush();
Thread.Sleep(100);
}
第二种情况运作良好。你认为我的解决方案可以接受吗?还是应该尝试更换客户?关于此问题的起因,您是否有任何经验或想法?您通常不应该在一个TcpClient/NetworkStream上创建多个streamwriter。正如您在StreamWriter的文档中所看到的,它希望获得已包装流的所有权,并在您处置StreamWriter后对其调用Dispose。您应该只创建一个StreamWriter并使用它发送所有行,或者您必须创建leaveOpen标志设置为true的StreamWriter,这样您就可以在不意外处理TcpClient的情况下处理它们
这并不能直接回答为什么没有收到额外的行。我可能猜它与StreamWriter内部的缓冲有关,在处理流之前,StreamWriter不会完全刷新。因此,我将尝试处理StreamWriter和/或只创建一个StreamWriter。或者是另一边的信号接收不正常?在这种情况下,使用Wireshark、tcpdump或strace检查真正写入套接字的内容将是最容易的。客户端正在统一地侦听一个名为Update的函数,该函数每帧调用一次。如果发送两次,第二个数据将在两帧之间发送,并且无法接收。睡眠是必要的 能否尝试使用var writer=new StreamWriterclient.getStream{SendDataHi,write;SendDataHow are?,writer;SendData?,writer;}?在writer上使用调用Dispose并销毁底层流。遗憾的是,tcp连接没有一个选项:如果您在其他地方也使用它,或者以后需要它,那么可以。但是你可以尝试在外部创建StreamWriter并按照@Matthias247的建议传递给SendData,它将只创建一个writer。这是一个很好的约定,我实现了它。谢谢你的帮助,但问题仍然没有改变。谢谢你的解释。我相应地修改了代码,看起来更干净了。但问题仍然存在。