C#BinaryReader.ReadChar在读取NetworkStream时抛出“System.ArgumentException:输出字符缓冲区太小”

时间:2013-08-30 10:21:52

标签: c# networkstream binaryreader

当读取C#NetworkStream(来自流式TCP套接字)时,BinaryReader.ReadChar偶尔会抛出异常System.ArgumentException: The output char buffer is too small to contain the decoded characters, encoding 'Unicode (UTF-8)'

所有缓冲区都有默认大小(没有一个是手动设置的),设置更大的缓冲区大小不会影响问题。

完全令人沮丧的是:

  • 使用断点并逐步走过ReadChar调用

  • 行时,不会发生异常
  • 如果ReadChar前面有Thread.Sleep(1000)(但仍可能发生较小的超时),则不会发生异常

  • BinaryReader上使用FileStream时不会发生异常,其中存储了TCP服务器答案的所有精确字节。

那么,从流套接字缓冲单个字符可能与时间相关的问题是什么?

2 个答案:

答案 0 :(得分:4)

我也有这个问题。以下是关于它的一些事实:

  1. System.ArgumentException: The output char buffer is too small to contain the decoded characters, encoding 'Unicode (UTF-8)'已知与UTF-8编码问题(无效字符代码)有关,而不是缓冲问题 - Detials here

  2. NetworkStreamRead和其他方法)已知只返回系统网络缓冲区中已存在的字节数,而不是阻塞,直到收到所有请求的数据 - { {3}}。因此,需要在循环中使用Read来获取所有请求的数据

  3. BinaryReader在从NetworkStream获取的数据少于预期时会抛出异常,而不是使用循环来检索其余数据(而且,我确定,这意味着一个错误!) - Details here

  4. 所以,我的解决方案是部分重新实现BinaryReader(我已经调用了我的类BinReader)添加一些有用的功能并使用循环创建正确的Read方法:

    public int Read( byte[] buf, int off, int count ) {
        int read = 0;
        while( read < count ) {
            int toread = count - read;
            int portion = BaseStream.Read( buf, off, toread );
            read += portion;
            off += portion;
        }
        return read;
    }
    

    这已经为我解决了。

答案 1 :(得分:0)

我不确定这是否是解决此问题的正确方法,但将 reader.ReadChar() 更改为 Convert.ToChar(reader.ReadByte()) 似乎对我有用。