繁体   English   中英

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

[英]Trouble receiving data to C socket client from Java socket server

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

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

如果您知道客户端发送的整个String的长度,则可以全部读取,然后使用定界符来String#split(regex)将其读入\\x 并再次使用Byte#parseByte(buffer, 16)进行转换。

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

首先说明显而易见的是,“ \\ 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导致大写的十六进制和%na换行符。 String.format

我的第一个猜测是,在C写入错误地做puts ,使用strlen左右。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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