0

我正在使用 Java 套接字程序将整数和字符从服务器写回客户端

    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

我想在线上写一个 int32 和一个 8B 的字符。对于我写的整数

    out.printf("%04x",1);

它在wireshark上显示为“30 30 30 31”,而我希望它显示为“01 00 00 00”。类似的 out.printf("%d",1); 它显示为“31”,而我想要它“01 00 00 00”。如何在电线上写一个 4B 的整数和一个 8B 的字符?表示是否与编码有关?

4

3 回答 3

2

使用 PrintWrite 将文本写入套接字并不理想,因为它会隐藏任何错误。

在您的情况下,您似乎想编写二进制文件,所以我建议您尝试一下。

DataOutputStream out = new DataOutputStream(
                       new BufferedOutputStream(clientSocket.getOutputStream()));

out.writeInt(1);

但是,如果您想起诉小端格式,我会使用阻塞 NIO。

SocketChannel sc = 
ByteBuffer bb= ByteBuffer.allocateDirect(1024).order(ByteOrder.LITTLE_ENDIAN);

bb.putInt(1);
// put whatever else
bb.flip();
while(bb.remaining() > 0) sc.write(bb);
于 2012-08-08T13:14:23.840 回答
1

是的。通过指定“%04x”和字符串转换,您可以为您的数据隐式选择十六进制编码(即将数字转换为 ASCII 字符串)。

改用 aByteBuffer将整数转换为四个字节。有关详细信息,请参阅此答案

于 2012-08-08T13:12:20.923 回答
1

如果要写入二进制数据,请不要使用 PrintWriter 或任何其他 Writer 作为包装器。尝试改用 DataOutputStream,它提供了一组用于写入 int 等的方法。

于 2012-08-08T13:13:23.490 回答