2012-08-08 63 views
0

我使用一个Java套接字程序从服务器写入整数和字符返回给客户端Java Socket技术作家

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的字符?表示与编码有关吗?

+0

你想要小端或大端格式吗? – 2012-08-08 13:15:04

+0

你正在写它作为一个字符串。 0是字符30,1是字符31.对于顺序,字节序进入游戏。 – CodeCaster 2012-08-08 14:44:13

回答

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); 
+0

我明白DataOutputStream的好处。但是由于某种原因,不会打印writeInt(1)和writeUTF(“Peter”)。如果我删除了BufferedOutputStream,那么它们就会被写入。任何想法为什么发生这种情况而且,我有兴趣通过一次调用发送一个int32和char [8],即连接在一个单独的PDU中,例如有效载荷“01 00 00 00 AA AA AA AA” – 2012-08-08 14:28:37

+0

您需要刷新流以推送数据。如果你取出BufferedOutputStream,它会变慢,但你不必刷新数据。如果你想合并int32和char [],那么你想要缓冲数据,然后在'char []' – 2012-08-08 14:34:55

+0

之后刷新数据:你不能认为因为你发送了int32和char []在一起你不会在一次read()中得到这个数据的一部分,(b)在一次read()中有多个“message”c)a和b的某种组合 – 2012-08-08 14:35:59

1

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

改为使用ByteBuffer将整数转换为四个字节。见this answer for details

1

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