C# C“BinaryReader.ReadChar抛出”;System.ArgumentException:输出字符缓冲区太小“;读取网络流时
在读取C#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),则不会发生异常(但在较
NetworkStream
(从流类型TCP套接字)时,BinaryReader.ReadChar
偶尔抛出异常System.ArgumentException:输出字符缓冲区太小,无法包含解码字符,编码为“Unicode(UTF-8)”
所有缓冲区都有其默认大小(没有一个是手动设置的),设置更大的缓冲区大小不会影响问题
而最令人沮丧的是:
- 使用断点并通过
调用逐步遍历行时,不会发生异常ReadChar
- 如果
前面有ReadChar
,则不会发生异常(但在较小的超时情况下仍可能发生)Thread.Sleep(1000)
- 在
上使用FileStream
时不会发生异常,TCP服务器应答的所有精确字节都存储在该文件中BinaryReader
那么,从套接字流中缓冲单个字符会有什么与时间相关的问题呢?我也有这个问题。以下是一些事实:
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())
似乎对我很有效