我遇到了问题。我正在使用Java编写一个简单的多线程TCP服务器,我目前遇到了这个问题:
客户端可以向我发送输入字符串,例如
[IDENTIFIER] text \ r \ n
这没关系,我完成了。每个输入查询都需要以 \ r \ n 结束,但有一种情况除外。
这种情况是客户端将图像作为二进制数据发送。此消息具有以下结构:
PHOTO [空格] [数据长度] [空格] [数据] [BIG ENDIAN中校验和的4个字节]
并且重点是要么返回
202 OKAY \ r \ n
校验和与数据中的位总和匹配时的消息,或者......
302 BAD CHECKSUM \ r \ n
......否则。但是,我在阅读4个字节时遇到了一些严重问题。 输入源是InputStreamReader的一个实例,从:
获取in = new InputStreamReader(this.clientSocket.getInputStream());
和函数InputStreamReader.read()返回刚刚读取的char的int。现在,我试着
correctChecksumBytes = new byte[4];
for( int i = 0 ; i < 4 ; ++i ) {
correctChecksumBytes[i] = (byte) in.read();
}
if (correctChecksumBytes == null) {
throw new BadSyntax();
}
bb = ByteBuffer.wrap(correctChecksumBytes);
bb.order(ByteOrder.BIG_ENDIAN);
fourByteCheck = bb.getInt();
但是,我现在明白,从in.read()返回的int是非常错误的,因为结果偏差很大。我一直认为ByteBuffer的使用是正确的,我只是不知道如何用正确的值填充字节数组。
我也尝试将InputSreamReader转换为字节数组,但我发现它不是一种有效的方法,因为消息......
PHOTO [空格] [数据长度] [空格] [数据] [BIG ENDIAN中4个字节的校验和] [IDENTIFIER] text \ r \ n
...有效,需要解释为2条消息。
我做了一些测试,发现我成功地设法读取了所有数据并计算了有效的校验和,因此输入中接下来的4个字节是校验和的4个字节,我还没有设法读取。
此外,这是一个有效的PHOTO消息的例子
照片8 ABCDEFGH \ x00 \ x00 \ x02 \ x24
所以我想问一下,如何读取这4个字节并将它们转换为int以与计算的校验和进行比较?
非常感谢
答案 0 :(得分:0)
InputStreamReader将读取基于字符的数据。您必须编写自定义InputStream并从中读取x个字节。