Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用tcp从PHP发送到JAVA后,数据已损坏_Java_Php_Sockets_Tcp - Fatal编程技术网

使用tcp从PHP发送到JAVA后,数据已损坏

使用tcp从PHP发送到JAVA后,数据已损坏,java,php,sockets,tcp,Java,Php,Sockets,Tcp,我正在尝试将数据从PHP TCP服务器发送到JAVA TCP客户端。 我通过比较数据的十六进制值来比较我的结果 PHP脚本读取STDIN,通过套接字一次发送一个字节,java使用DataInputStream.read()读取,转换为十六进制并显示 如果我在脚本中手动输入数据,它可以正常工作。 如果我使用带有数据的文件-它工作正常 但是当我分配/dev/uradom(甚至是几个字节)时,java端的数据就被破坏了。在随机位置总是有一个十六进制值efbfbd,而不是正确的数据。 请帮我解决这个问题

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

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

如果我在脚本中手动输入数据,它可以正常工作。 如果我使用带有数据的文件-它工作正常 但是当我分配/dev/uradom(甚至是几个字节)时,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;

}

你在编码上遇到了障碍。通过调用
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字符串是完全不同的。它在内部由
字符数组