无法从Java套接字服务器接收数据到C套接字客户端

时间:2014-08-06 09:36:21

标签: java c sockets

我的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));
}

2 个答案:

答案 0 :(得分:0)

如果您不知道消息的长度,则需要将每个字节重复读取到字符串缓冲区中,并使用Byte#parseByte(buffer, 16)创建签名字节 [ - 127, 127] 出来。

如果您知道客户端发送的整个String的长度,您可以全部读取它,然后String#split(regex)使用一个似乎在您的\x中的分隔符。并再次使用Byte#parseByte(buffer, 16)进行转换。

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

答案 1 :(得分:0)

首先说明显而易见的,“\ 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可以替代。

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