繁体   English   中英

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);

客户只收到第一行。 我将Thread.Sleep(100)添加到SendData()方法中,如下所示:

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并使用它发送所有行,或者必须将leaveOpen标志设置为true来创建StreamWriter ,这使您可以Dispose它们而不会意外处置TcpClient

这不能直接回答为什么没有收到其他行的原因。 我可能会猜测它必须对StreamWriter内部的缓冲进行某些处理,直到处理完流之后,该缓冲才会被完全刷新。 因此,我将尝试处置StreamWriters和/或仅创建一个。 还是另一侧的接收无法正常工作? 在这种情况下,最简单的方法是使用Wireshark,tcpdump或strace检查真正写入套接字的内容。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM