当读取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服务器答案的所有精确字节。
那么,从流套接字缓冲单个字符可能与时间相关的问题是什么?
答案 0 :(得分:4)
我也有这个问题。以下是关于它的一些事实:
System.ArgumentException: The output char buffer is too small to contain the decoded characters, encoding 'Unicode (UTF-8)'
已知与UTF-8编码问题(无效字符代码)有关,而不是缓冲问题 - Detials here
NetworkStream
(Read
和其他方法)已知只返回系统网络缓冲区中已存在的字节数,而不是阻塞,直到收到所有请求的数据 - { {3}}。因此,需要在循环中使用Read
来获取所有请求的数据
BinaryReader
在从NetworkStream
获取的数据少于预期时会抛出异常,而不是使用循环来检索其余数据(而且,我确定,这意味着一个错误!) - Details here
所以,我的解决方案是部分重新实现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())
似乎对我有用。