gpt4 book ai didi

java - 使用 tcp 从 PHP 发送到 JAVA 后数据损坏

转载 作者:行者123 更新时间:2023-12-01 22:18:09 24 4
gpt4 key购买 nike

我正在尝试将数据从 PHP TCP 服务器发送到 JAVA TCP 客户端。我通过比较数据的十六进制值来比较我的结果。

PHP 脚本读取 STDIN,通过套接字每次发送一个字节,java 使用 DataInputStream.read() 读取它,转换为十六进制并显示。

如果我手动将数据输入脚本 - 它工作正常。如果我使用带有数据的文件 - 它工作正常但是当我分配/dev/urandom(甚至几个字节)时 - java 端的数据即将损坏。随机位置始终存在十六进制值 efbfbd,而不是正确的数据。请帮我解决这个问题。PHP代码:

$f = fopen( 'php://stdin', 'rb' );
while($line = fread($f, 1)){

$length = 1;
echo bin2hex($line)."\n";
echo socket_write($client, $line, 1)."\n";

$sent = socket_write($client, $line, $length);

if ($sent === false) {

break;
}

// Check if the entire message has been sented
if ($sent < $length) {

// If not sent the entire message.
// Get the part of the message that has not yet been sented as message
$line = substr($line, $sent);

// Get the length of the not sented part
$length -= $sent;

}

Java代码:

in = new DataInputStream(clientSocket.getInputStream());

byte[] data = new byte[1];

int count = 0;
while(in.available() > 0){
//System.out.println(in.available());
in.read(data);
String message = new String(data);

System.out.println(message);
//System.out.flush();

System.out.println( toHex(message) );
//in.flush();
message = "";



}

最佳答案

您在编码方面遇到了困难。通过调用new String(data)字节数组将使用默认编码转换为字符串,无论该编码是什么(例如,您可以将 java -Dfile.encoding=UTF-8 的编码设置为 UTF-8)。

您想要的 Java 代码很可能如下所示:

    in = new DataInputStream(clientSocket.getInputStream());

byte[] data = new byte[1];

int count = 0;
while (in.available() > 0) {
// System.out.println(in.available());
in.read(data);
String hexMessage = Integer.toHexString(data[0] & 0xFF);
String stringMessage = new String(data, "UTF-8"); // US-ASCII, ISO-8859-1, ...
System.out.println(hexMessage);
}

更新:我错过了 32 位问题。 8位byte在 Java 中进行签名的 ,被符号扩展为 32 位 int 。为了有效地撤消这一符号扩展,可以屏蔽 byte0xFF .

关于java - 使用 tcp 从 PHP 发送到 JAVA 后数据损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30578629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com