【问题标题】:Correct way to read stream char by char按字符读取流字符的正确方法
【发布时间】:2015-02-19 07:08:06
【问题描述】:

我正在尝试读取流,流仍在继续。

我已经了解了以下内容,但我觉得有点奇怪,我必须经常检查空流字符。有没有办法让线程休眠,直到有更多数据?

这里的速度非常重要,因为它必须处理高负载。

NetworkStream networkStream = client.GetStream();
try
{
    var reader = new StreamReader(networkStream);
    StringBuilder stringBuilder = new StringBuilder();

    char c = (char)reader.Read();
    while (true)
    {
        if (c != (char)65535)
        {
            if (c == StreamSettings.MessageSplitChar)
            {
                // Do work with string here
            } 
            else
            {
                stringBuilder.Append(c);
            }
        }
        else
        {
            // No work to do sleep some
            Thread.Sleep(10);
        }
        c = (char)reader.Read();
    }
}
catch (Exception ex)
{
    throw;
}

【问题讨论】:

  • 好吧,你不知道。如果您从 StreamReader.Read() 获得 -1,则将不再接收数据。您不妨使用 ReadToEnd(),然后处理文本。传输文本通常更聪明的方法是首先发送字节数,以便接收者知道何时停止读取。例如,这就是 HTTP 的工作原理。
  • 流另一端的客户端正在生成数据。因此,在搜索已读取到流末尾的消息之间可能会有时间,但客户端稍后会写入更多。如果我读到最后,它将永远不会结束,因为流将在客户端的生命周期内保持打开状态。
  • 这没什么意义,如果是这种情况,StreamReader.Read() 将简单地阻塞而不是返回 -1。 HTTP 方法的优点是不必关闭套接字来指示结束。
  • ReadToEnd() 将继续读取直到流关闭!我想避免关闭流。

标签: c# stream tcpclient


【解决方案1】:

Read 等到至少还有一个字节可用。你不需要等待自己。它在流的末尾返回-1

(char)65535 是一个黑客。这是一个溢出的演员阵容。只需检查-1

【讨论】:

    猜你喜欢
    • 2020-06-08
    • 2018-02-07
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2021-04-27
    • 1970-01-01
    • 2017-11-26
    相关资源
    最近更新 更多