C# C“BinaryReader.ReadChar抛出”;System.ArgumentException:输出字符缓冲区太小“;读取网络流时

C# C“BinaryReader.ReadChar抛出”;System.ArgumentException:输出字符缓冲区太小“;读取网络流时,c#,networkstream,binaryreader,C#,Networkstream,Binaryreader,在读取C#NetworkStream(从流类型TCP套接字)时,BinaryReader.ReadChar偶尔抛出异常System.ArgumentException:输出字符缓冲区太小,无法包含解码字符,编码为“Unicode(UTF-8)” 所有缓冲区都有其默认大小(没有一个是手动设置的),设置更大的缓冲区大小不会影响问题 而最令人沮丧的是: 使用断点并通过ReadChar调用逐步遍历行时,不会发生异常 如果ReadChar前面有Thread.Sleep(1000),则不会发生异常(但在较

在读取C#
NetworkStream
(从流类型TCP套接字)时,
BinaryReader.ReadChar
偶尔抛出异常
System.ArgumentException:输出字符缓冲区太小,无法包含解码字符,编码为“Unicode(UTF-8)”

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

而最令人沮丧的是:

  • 使用断点并通过
    ReadChar
    调用逐步遍历行时,不会发生异常

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

  • FileStream
    上使用
    BinaryReader
    时不会发生异常,TCP服务器应答的所有精确字节都存储在该文件中


那么,从套接字流中缓冲单个字符会有什么与时间相关的问题呢?

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

  • System.ArgumentException:输出字符缓冲区太小,无法包含解码字符,编码“Unicode(UTF-8)”
    已知与UTF-8编码问题(无效字符代码)有关,而不是与缓冲问题有关-

  • NetworkStream
    Read
    和其他方法)已知只返回系统网络缓冲区中已经存在的字节数,而不是阻塞,直到接收到所有请求的数据。因此,需要在循环中使用
    Read
    ,以获取所有请求的数据

  • binarydreader
    已知在从
    NetworkStream
    获取的数据少于预期时会引发异常,而不是使用循环来检索其余数据(是的,我确信,这意味着一个bug!)-

  • 因此,我的解决方案是部分重新实现
    binarydreader
    (我调用了我的类
    BinReader
    ),添加一些有用的特性,并使用循环生成适当的读取方法:

    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;
    }
    
    public int Read(字节[]buf,int off,int count){
    int read=0;
    while(读取<计数){
    int toread=计数-读取;
    int部分=基流读取(buf、off、toread);
    读取+=部分;
    off+=部分;
    }
    返回读取;
    }
    

    这对我来说已经解决了。

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