【问题标题】:Trouble receiving data to C socket client from Java socket server从 Java 套接字服务器向 C 套接字客户端接收数据时出现问题
【发布时间】:2014-08-06 19:14:03
【问题描述】:

我的 Socket 客户端是用 C 编写的,并以以下格式发送值:

x00\x2C\x02\x00\xE0\x00

现在我想从用 Java 编写的 TCP/IP 套接字服务器读取十六进制值。

在 Java Socket 中读取流值的方法应该是什么?

我正在尝试按以下方式阅读,但它不起作用:

InputStream ins = sock.getInputStream();
int byteRead;

while((byteRead = ins.read()) != -1) {
  System.out.println(Integer.toHexString(byteRead & 0xFF));
}

【问题讨论】:

  • 查看Socket 输入(输出)流。通过网络传输的数据始终是二进制的,因此它只取决于您在接收端如何解释它。
  • 尝试阅读如原帖所示。
  • “下面的格式”实际上就是一个“格式”。数据仍然是二进制的。它是六个字节,值0x002C0200E000. 你可以用DataInputStream.readShort()/.readInt() 读取。
  • 你可以使用 Integer.parseInt(hexString, 16) ,正如你在stackoverflow.com/questions/3834468/…中看到的那样
  • 你的意思是发件人实际上是在发送一个包含十六进制表示的字符串?在这种情况下,您应该将字符串转换为整数,而不是其他方式。

标签: java c sockets


【解决方案1】:

首先要说明的是,“\x41”是一个字节,带有十六进制 41,也就是 ASCII 'A'。 C 字符串也有一个终止 \x00 跟随它。 所以你在写

\x00\x2C\x02\x00\xE0\x00

作为大小为 6 的 char 数组。将其写为字符串将写入一个空字符串,因为第一个字节是 \x00

在java方面\x00没有问题,只是一个普通的字节/字符。

java 代码没问题。变化可能是:

try (InputStream ins = new BufferedInputStream(sock.getInputStream())) {
    int byteRead;
    while ((byteRead = ins.read()) != -1) {
        System.out.printf("%02X%n", byteRead & 0xFF);
    }
} // Closes

这里大写的 X 导致大写十六进制,%n 换行。 String.format 将是替代方案。

我的第一个猜测是 C 编写错误地使用 puts 完成,使用 strlen 左右。

【讨论】:

  • 感谢您的解决方案。打印格式是解决我们问题的线索。
【解决方案2】:

如果您不知道消息的长度,则需要将每个字节表示读取到字符串缓冲区中并使用Byte#parseByte(buffer, 16) 生成一个有符号字节[-127, 127] 离开它。

如果您知道客户端发送的整个字符串的长度,您可以阅读所有内容,然后使用分隔符 String#split(regex) 它在您的情况下似乎是 \x。并再次使用Byte#parseByte(buffer, 16) 进行转换。

如果您需要 无符号[0, 255],那么您必须使用 Integer.html#parseInt(buffer, 16)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    相关资源
    最近更新 更多