【问题标题】:C# read all bytesC#读取所有字节
【发布时间】:2014-04-23 07:00:28
【问题描述】:

我正在尝试用 C# 编写一个简单的客户端/服务器应用程序。以下是发送给我的客户端的示例服务器回复:

reply {20}<entry name="test"/>

其中 {20} 表示完整回复包含的字符数。 在我下面写的代码中,我如何使用这个数字来循环和读取所有字符?

TcpClient tcpClient = new TcpClient(host, port);

NetworkStream networkStream = tcpClient.GetStream();

...

// Server Reply
if (networkStream.CanRead)
{
    // Buffer to store the response bytes.
    byte[] readBuffer = new byte[tcpClient.ReceiveBufferSize];

    // String that will contain full server reply
    StringBuilder fullServerReply = new StringBuilder();

    int numberOfBytesRead = 0;

    do
    {
        numberOfBytesRead = networkStream.Read(readBuffer, 0, readBuffer.Length);
        fullServerReply.AppendFormat("{0}", Encoding.UTF8.GetString(readBuffer, 0, tcpClient.ReceiveBufferSize));
    } while (networkStream.DataAvailable);
}

【问题讨论】:

  • 您是选择了这种有线格式还是强加于您。如果它是您的选择,我会使用更简单的东西(带前导零的固定大小)
  • 有线格式是强加给我的。

标签: c# tcpclient networkstream


【解决方案1】:

您没有使用numberOfBytesRead。令我着迷的是,每第二个 TCP 问题的答案都与此相同。

除此之外,您不能在任意边界处拆分 UTF-8 编码的字符串。 Encoding.UTF8.GetString 将返回垃圾。使用StreamReader

【讨论】:

  • 我做了您推荐的所有更改,但我仍然无法接收所有数据(例如包含 50000 个字符的回复)。如果我将 byte[tcpClient.ReceiveBufferSize] 修改为 byte[10485760] 那么我得到了所有。当我不知道有多少数据时,如何获取所有数据?
  • 你读到读到零字节。这就是流的尽头。按照惯例,所有流都以这种方式工作。这与从文件中读取时没有什么不同。请注意,您将收到任意块的数据。
  • 抱歉我的愚蠢问题,我以前从未这样做过。我怎么知道有下一个块,我如何得到下一个块?
  • @jadrijan 您只需阅读即可获得下一个块。知道是否有另一个更难。在您的情况下,您知道消息的长度(“{20}”)。一直读到你读完这么多字节。不要少读或多读。或者,如果您知道远程端将在发送完所有数据后关闭连接,您可以读取直到 Read 返回 0(流的结尾)。
【解决方案2】:

代码非常错误。 @usr 已经指出了两个大错误。

这里是更正的代码:

// Server Reply
if (networkStream.CanRead) {
  // Buffer to store the response bytes.
  byte[] readBuffer = new byte[tcpClient.ReceiveBufferSize];
  string fullServerReply = null;
  using (var writer = new MemoryStream()) {
    while (networkStream.DataAvailable) {
      int numberOfBytesRead = networkStream.Read(readBuffer, 0, readBuffer.Length);
      if (numberOfBytesRead <= 0) {
        break;
      }
      writer.Write(readBuffer, 0, numberOfBytesRead);
    }
    fullServerReply = Encoding.UTF8.GetString(writer.ToArray());
  }
}

【讨论】:

猜你喜欢
  • 2021-04-03
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 2019-12-02
  • 2021-01-30
  • 1970-01-01
相关资源
最近更新 更多