Java TCP套接字:从固定长度报头获取传入消息的大小

我在许多地方都看到了这种模式:服务器在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解码数据,但是我无法编写能做到这一点的代码:

  1. 有效(缓冲?)读取前8个字节(仅)
  2. 将这些字节转换为数字
  3. 通过准确指定要读取的字节数来有效读取消息的其余部分

我已经尝试过各种方法,例如:

BufferedInputStream msgHeader = new BufferedInputStream(socket.getInputStream());
byte[] length = msgHeader.readNBytes(4);

但是,充其量来说,我得到的是乱码,而不是数字。其他方式只会导致客户端无法读取流...:(

endwar 回答:Java TCP套接字:从固定长度报头获取传入消息的大小

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3073456.html

大家都在问