将字节写入java套接字

时间:2015-01-27 20:22:15

标签: java sockets

我试图在我创建的Java套接字中写入0x87。

tcpSocket = new Socket(server, port);
tcpWriteToServer = new PrintWriter(tcpSocket.getOutputStream(), true);
byte [] header = {0x8, 0x7};
tcpWriteToServer.print(header);

在服务器端,我得到:

Incoming Bytes: 0x5b 0x42 0x40 0x34 0x32 0x65 0x62 0x35 0x62 0x38 0x38 

我试图解决问题,只发送一个字节:

tcpWriteToServer.print(header[0]);

为此,我最终得到:

Incoming Bytes: 0x38

我不确定那" 3" in" 0x38"得到阅读。我读了" 0x37"当我尝试发送" 0x7"。

服务器端是用python编写的,我在python中发送字节和正确读取没有问题。

知道我可能缺少什么吗?

2 个答案:

答案 0 :(得分:2)

  

知道我可能缺少什么吗?

您必须决定是要编写文本还是二进制文件。将它们结合起来可能是一种让自己迷惑的好方法。

我建议你在这种情况下使用二进制文件。

tcpSocket = new Socket(server, port);
out = tcpSocket.getOutputStream();
out.write(0x8);
out.write(0x7);

您也可以像这样缓冲输出。

out = new BufferedOutputStream(tcpSocket.getOutputStream());
out.write(0x8);
out.write(0x7);
out.flush();

如果你有一个字节数组,你可以一次写下它们。

byte[] header = { .... };
out.write(header);
  

我不确定“0x38”中的“3”是如何读取的。我尝试发送“0x7”时读到“0x37”。

没有print(byte),但有print(int),所以当你做

print(8);

相同
print(Integer.toString(8));

print("8");

print('8')
ASCII中的

和'8'= 0x38

答案 1 :(得分:1)

  

传入字节:0x5b 0x42 0x40 0x34 0x32 0x65 0x62 0x35 0x62 0x38 0x38

如果打印出每个字节的字符表示

byte[] bytes = {0x5b, 0x42, 0x40, 0x34, 0x32, 0x65, 0x62, 0x35, 0x62, 0x38, 0x38};
for (byte b : bytes){
    System.out.print((char)b);
}

您会看到代码发送[B@42eb5b88

之所以发生这种情况,是因为PrintWriter没有print(byte[])方法,它使用print(Object obj)只发送对象obj的字符串表示。这样的字符串是使用String.valueOf(obj)创建的,内部使用obj.toString()方法,对于数组返回typeName[b - 一维[字节数组{{1 }}),b@

换句话说,您没有发送hexHashCode数组的内容,而是发送header方法的结果。

如果要发送字节,则更容易使用toString()(Writers ware用于处理文本,而不是字节)及其Stream方法。如果您还希望能够发送文本而不是字节,则可以使用write(byte[])

PrintStream