我试图在我创建的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中发送字节和正确读取没有问题。
知道我可能缺少什么吗?
答案 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