【问题标题】:Read Socket stream data and read first 2 bytes, find rest of message length读取 Socket 流数据并读取前 2 个字节,找到剩余的消息长度
【发布时间】:2013-04-15 18:38:54
【问题描述】:

如何从输入流中读取前 2 个字节并将 2 个字节的数据转换为实际的 int 长度值,然后读取消息的其余部分并将其复制到字节数组中。 数据数组的其余部分应该在从流中读取前 2 个字节后定义,有人知道有效的逻辑吗?

【问题讨论】:

  • @ejp 投票是匿名的,无需解释。要求解释是噪音,应该被删除。

标签: java sockets inputstream bytearrayinputstream


【解决方案1】:

使用DataInputStream. 使用readUnsignedShort() 方法返回长度字,然后使用readFully() 方法读取以下数据。

【讨论】:

  • 非常感谢您的所有鼓励。如果我从输入流中收到多条消息,我不需要使用 while 循环吗?因为不断有数据从套接字流出。
  • 只有在大小最多为 (2^15)-1 时才有效。如果大小大于 Short.MAX_VALUE,readShort 将返回一个负数
  • @pradeekrathnayaka 当然你需要一个循环。每次迭代都应该执行上述操作。
  • @EJP 谢谢。我从来没有注意到 readUnsignedShort 方法,总是按位 &0xFFFF 掩码来转换它。这对读者来说更清楚。 +1
【解决方案2】:

这会从一个字节数组创建一个字符串。根据需要进行调整。

InputStream in;
try {
    in = socket.getInputStream();
    DataInputStream dis = new DataInputStream(in);

    int len = dis.readInt();
    byte[] data = new byte[len];
    if (len > 0) {
       dis.readFully(data);
    }           
    String sReturn = new String(data); 
}

【讨论】:

  • 差不多,但是读取的是 4 个字节的长度信息,而不是两个。
猜你喜欢
  • 2014-08-22
  • 2019-03-02
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
相关资源
最近更新 更多