Java Socket编写器

时间:2012-08-08 13:08:15

标签: java sockets

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

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

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

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

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

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

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

使用ByteBuffer代替将整数转换为四个字节。请参阅this answer for details

答案 2 :(得分:1)

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