使用tcp从PHP发送到JAVA后,数据已损坏
我正在尝试将数据从PHP TCP服务器发送到JAVA TCP客户端。 我通过比较数据的十六进制值来比较我的结果 PHP脚本读取STDIN,通过套接字一次发送一个字节,java使用DataInputStream.read()读取,转换为十六进制并显示 如果我在脚本中手动输入数据,它可以正常工作。 如果我使用带有数据的文件-它工作正常 但是当我分配/dev/uradom(甚至是几个字节)时,java端的数据就被破坏了。在随机位置总是有一个十六进制值efbfbd,而不是正确的数据。 请帮我解决这个问题。 PHP代码:使用tcp从PHP发送到JAVA后,数据已损坏,java,php,sockets,tcp,Java,Php,Sockets,Tcp,我正在尝试将数据从PHP TCP服务器发送到JAVA TCP客户端。 我通过比较数据的十六进制值来比较我的结果 PHP脚本读取STDIN,通过套接字一次发送一个字节,java使用DataInputStream.read()读取,转换为十六进制并显示 如果我在脚本中手动输入数据,它可以正常工作。 如果我使用带有数据的文件-它工作正常 但是当我分配/dev/uradom(甚至是几个字节)时,java端的数据就被破坏了。在随机位置总是有一个十六进制值efbfbd,而不是正确的数据。 请帮我解决这个问题
$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;
}
你在编码上遇到了障碍。通过调用
newstring(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位的问题。用Java签名的8位
字节
,被符号扩展为32位int
。为了有效地撤消此符号扩展,可以用编码时遇到的问题来屏蔽字节。通过调用newstring(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位的问题。用Java签名的8位
字节
,被符号扩展为32位int
。为了有效地撤消此符号扩展,可以用编码时遇到的问题来屏蔽字节。通过调用newstring(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位的问题。用Java签名的8位
字节
,被符号扩展为32位int
。为了有效地撤消此符号扩展,可以用编码时遇到的问题来屏蔽字节。通过调用newstring(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位的问题。用Java签名的8位
字节
,被符号扩展为32位int
。为了有效地撤消此符号扩展,可以使用0xFF
来屏蔽字节
,正如上面的注释所说,您可能在字节的字符串表示法字符串消息=新字符串(数据)方面遇到问题
可以肯定的是,您应该获取数据字节,并以Base64为例对它们进行编码。您可以使用诸如或之类的库来执行此操作。您应该能够在PHP中进行类似的比较。正如上面的评论所说,您可能在字节的字符串表示法方面遇到问题string message=new string(data)
可以肯定的是,您应该获取数据字节,并以Base64为例对它们进行编码。您可以使用诸如或之类的库来执行此操作。您应该能够在PHP中进行类似的比较。正如上面的评论所说,您可能在字节的字符串表示法方面遇到问题string message=new string(data)
可以肯定的是,您应该获取数据字节,并以Base64为例对它们进行编码。您可以使用诸如或之类的库来执行此操作。您应该能够在PHP中进行类似的比较。正如上面的评论所说,您可能在字节的字符串表示法方面遇到问题string message=new string(data)
可以肯定的是,您应该获取数据字节,并以Base64为例对它们进行编码。您可以使用诸如或之类的库来执行此操作。您应该能够在PHP中进行类似的比较。您的Java程序存在两个主要问题
首先-在.available()中使用
。它不会告诉您消息中还有多少字节。它仅仅表示流中有多少字节已准备就绪,可以在不被阻塞的情况下进行读取。例如,如果服务器通过套接字发送两个数据包,一个已经到达,但一个仍在通过Internet发送,每个数据包有200个字节(这只是一个示例),那么在第一次呼叫中,您将得到答案200
。如果你读了200字节,你肯定不会被阻止。但是,如果第二个数据包尚未到达,您对.available()中的的下一次检查将返回0
。如果你在这一点上停止,你只有一半的数据。不是你想要的
通常,您要么必须一直读到流的末尾(InputStream.read()
returns-1),然后您就不能再使用同一个流并关闭套接字,要么您有一个特定的协议,告诉您预期的字节数和读取的字节数
但这并不是您在程序输出中看到奇怪值的原因。原因是Java和PHP代表的字符串完全不同。在PHP中,字符串可以包含任何字节,并且它们作为字符的解释取决于prorgrammer
这基本上意味着PHP字符串相当于Java中的字节[]
但是Java字符串是完全不同的。它在内部由字符数组
和