【发布时间】:2010-04-22 01:47:14
【问题描述】:
我有一个 TCP 套接字客户端从服务器接收消息(数据)。 消息的类型为长度(2 个字节)+ 数据(长度字节),由 STX 和 ETX 字符分隔。
我正在使用 bufferedReader 检索前两个字节,解码长度,然后从同一个 bufferedReader 再次读取适当的长度并将结果放入 char 数组中。
大多数时候,我没有问题,但有时(收到的数千条消息中有 1 条),当尝试从阅读器读取(长度)字节时,我只得到其中的一部分,我的数组的其余部分是填充“NUL”字符。我想这是因为缓冲区还没有被填满。
char[] bufLen = new char[2];
_bufferedReader.read(bufLen);
int len = decodeLength(bufLen);
char[] _rawMsg = new char[len];
_bufferedReader.read(_rawMsg);
return _rawMsg;
我用几种迭代方式解决了这个问题:
首先我测试了数组的最后一个字符:如果不是 ETX,我会从 bufferedReader 中一个一个读取字符,直到达到 ETX,然后重新开始我的常规程序。这 结果是我基本上会 DROP 一条消息。
然后,为了仍然检索该消息,我会在我的“截断”消息中找到 NUL 字符的第一次出现,一次读取并存储其他字符,直到我到达 ETX,然后附加它们对于我的“截断”消息,确认长度是可以的。
它也有效,但我真的认为我可以做得更好,比如在读取缓冲区之前检查我需要的字符总数是否可用,但找不到正确的方法...
任何想法/指针?
谢谢!
【问题讨论】: