繁体   English   中英

将字节写入Java套接字

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM