[英]Writing bytes to java socket
我正在尝试在创建的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
我不确定如何读取“ 0x38”中的“ 3”。 当我尝试发送“ 0x7”时,我读到“ 0x37”。
服务器端是用python编写的,我在使用python发送字节并正确读取时没有任何问题。
知道我可能会缺少什么吗?
知道我可能会缺少什么吗?
您必须决定要编写文本还是二进制文件。 合并它们可能是使自己困惑的好方法。
我建议您在这种情况下使用二进制文件。
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
传入字节: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表示形式。 此类字符串是使用String.valueOf(obj)
创建的,该字符串内部使用obj.toString()
方法,该方法对于数组返回typeName
( [b
一维[
字节数组b
), @
和hexHashCode
。
换句话说,您不是发送header
数组的内容,而是发送其toString()
方法的结果。
如果要发送字节,则使用Stream
(用于处理文本而不是字节的Writers固件)及其write(byte[])
方法更容易。 如果您还希望发送文本而不是字节,则可以使用PrintStream
PrintStream tcpWriteToServer = new PrintStream(tcpSocket.getOutputStream(), true);
tcpWriteToServer.write(header);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.