【问题标题】:Sending int through socket in Java在 Java 中通过套接字发送 int
【发布时间】:2023-03-19 16:56:01
【问题描述】:

在 Java 中通过套接字发送 int 的最佳方法是什么?我现在在看

sockout.write((byte)( length >> 24 ));
sockout.write((byte)( (length << 8) >> 24 ));
sockout.write((byte)( (length << 16) >> 24 ));
sockout.write((byte)( (length << 24) >> 24 ));

然后尝试从另一端的字节重建 int,但它似乎不起作用。有什么想法吗?

谢谢。

【问题讨论】:

  • 一般来说,你的方式也应该可行,但亚当的答案是更好的 IMO。虽然,这样做的常规方法是 ((length >> i) & (byte) 0xff) 其中 i 是 (0, 8, 16, 24) 之一,它可以保护您免受问题的影响,以防整数的原始值为否定的。

标签: java networking sockets integer


【解决方案1】:

DataOutputStream 包裹你的OutputStream,然后使用writeInt() 方法。

其他可能有用的事情是,在另一端,您可以将我们的 InputStream 包装在 DataInputStream 中,然后使用 readInt() 读取 int 退出。

这两个类还包含许多其他有用的方法,用于读取和写入其他原始类型。

【讨论】:

  • 只有在另一端也有java的情况下。
  • @DenisTulskiy - 另一端可以是任何语言。 DataOutputStream 几乎完全写入与语言无关的输出(utf8 字符串除外)。
  • @jtahlborn 为什么 utf8 字符串是一个例外?最终不都是字节吗?
  • @b1naryatr0phy 好吧,writeUTF() 使用了一种不通用的格式(与发送整数相反,它不同于字节序 通用的)。那是因为它发送长度(作为short,这令人担忧)后跟 UTF-8 字节。 that 格式没有任何问题或专有性,因此您只需确保另一端期望该格式(而不是将长度作为int 发送或发送固定-没有长度标记的大小字符串)
  • @AdamBatkin 我现在明白了,感谢您为我澄清这一点。
【解决方案2】:

您可以使用其他类型的流,可以直接发送整数。您可以使用数据输出流。观察,

DataOutputStream out;
try {
    //create write stream to send information
    out=new DataOutputStream(sock.getOutputStream());
} catch (IOException e) { 
    //Bail out
}

out.writeInt(5);

【讨论】:

    【解决方案3】:

    如果你是发送少量数据,那么编码为字符数据(例如Integer.toString(length))并在另一端解码并非不合理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2014-01-11
      • 2021-01-11
      • 1970-01-01
      • 2017-08-26
      相关资源
      最近更新 更多