【问题标题】:Which method of sending messages in TCP more preferred? [closed]在 TCP 中发送消息的哪种方法更受欢迎? [关闭]
【发布时间】:2018-02-25 13:24:16
【问题描述】:

我正在使用 C# 制作 TCP 客户端/服务器应用程序,但我很困惑在通过网络发送消息时这两种风格之间使用什么更好。

我遇到的第一个样式是将消息转换为字节数组,然后使用NetworkStream.Write(*) 方法将其写入 TcpClient 实例的 NetworkStream。

void StyleOne(string msg)
{
            TcpClient client = new TcpClient();
            client.Connect(ip, port);
            NetworkStream nwStream = client.GetStream();
            byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes(msg);

            nwStream.Write(bytesToSend, 0, bytesToSend.Length);
            nwStream.Flush();
            client.Close();
}

我遇到的另一种风格是将 TcpClient 实例的 NetworkStream 传递给 StreamWriter,然后使用StreamWriter.Write() 方法将消息写入流

void StyleTwo(string msg)
{
            TcpClient client = New TcpClient(ip, port);
            StreamWriter writer = New StreamWriter(client.GetStream());
            writer.Write(msg);
            writer.Flush();
            client.Close();
}

如果通过网络发送的消息最多只有 1 兆字节,那么这两者中的哪一个在内存、速度和性能方面更有效?

【问题讨论】:

  • 第一种方法更好,因为您知道编码。 Ascii 编码将删除不可打印的字符。
  • @jdweng - Ascii 包含不可打印字符,它们可以(并且必须)通过 TCP 传输。
  • 这不是 ASCII。它是二进制的,对二进制数据使用编码会破坏数据。必须发送字节数组或打包(如 64 位字符串)。

标签: c# networking tcp tcpclient


【解决方案1】:

StreamWriter 实例始终使用相同的编码(您可以在其构造函数中指定),并且有一些方便的方法可以将不同类型的数据写入流。

在您的第一个示例中,您或多或少地完全按照 StreamWriter 在幕后所做的事情:应用编码并将数据写入底层流。

如果您必须发送多位数据(以相同的编码),使用StreamWriter 会产生更清晰的代码。对于一个string,我认为你采用哪种方法并不重要。

【讨论】:

  • 所以基本上,他们在做什么和效率方面是一样的?如果我使用此StreamWriter writer = new StreamWriter(client.GetStream(), ASCIIEncoding.ASCII) 创建StreamWriter 的实例,它将与第一个代码sn-p 相同?内存、速度等没有区别?
  • @ReiSchneider 总是有区别的,自己应用编码的开销会少一点。我确实认为 L.B 试图提供帮助,因为很多人倾向于优化性能而没有意识到他们的代码正在变得一团糟。如果这里不是这种情况,请不要把它当作个人:)
猜你喜欢
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 2021-06-10
  • 2021-10-07
相关资源
最近更新 更多