我在许多地方都看到了这种模式:服务器在TCP套接字上将消息作为文本发送,并带有固定长度的标头。客户端首先读取标头,然后知道要读取多少消息。
但是,也许是因为它是如此简单,所以我无法找到有关如何以客户身份进行处理的示例。
目前,我可以像这样读取行:
BufferedReader in = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
while ((inputLine = in.readLine()) != null) {...
在WireShark中,我可以看到传入的消息:�<?xml vers...
在调试中,我可以看到一些数字:
value = {byte[116]@2160}
(0,0)(0,0)(4,0)(-3,-1)(60,0)...
- 我知道(60,0)是'
- 我知道前8个字节是一个固定大小的标头,其中包含后面的数据长度
我能够使用UTF-8解码数据,但是我无法编写能做到这一点的代码:
- 有效(缓冲?)读取前8个字节(仅)
- 将这些字节转换为数字
- 通过准确指定要读取的字节数来有效读取消息的其余部分
我已经尝试过各种方法,例如:
BufferedInputStream msgHeader = new BufferedInputStream(socket.getInputStream());
byte[] length = msgHeader.readNBytes(4);
但是,充其量来说,我得到的是乱码,而不是数字。其他方式只会导致客户端无法读取流...:(