PHP套接字Java消息交换

PHP套接字Java消息交换,java,php,sockets,Java,Php,Sockets,我试图在PHP页面和运行Java服务器之间进行通信。 只需通过套接字进行简单的字符串交换 这是我处理连接的线程的Java代码: InputStream in = clientSocket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in)); BufferedWriter out = new BufferedWr

我试图在PHP页面和运行Java服务器之间进行通信。 只需通过套接字进行简单的字符串交换

这是我处理连接的线程的Java代码:

            InputStream in = clientSocket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));

                String request;

                if((request=br.readLine())!=null){
                System.out.println("got the following request: " + request);
                out.write(request +"\n");
                out.flush();

                out.close();
                in.close();
                }
我用简单的Java客户机对其进行了测试,该客户机发送字符串,然后接收结果并将其打印回来,结果正常。客户端和服务器都有相同的输出

这是我的PHP代码:

$fp = @fsockopen ($host, $port, $errno, $errstr);

if($fp){
    fputs($fp, $str);
    //echo fgets($fp);
}

close($fp);
它将字符串发送到服务器,服务器接收该字符串。 但一旦我用fgets($fp)取消对行的注释,我就会被阻塞,直到1-2分钟后出现某种超时。在该阻塞期间,我的服务器没有接收任何内容。 超时后,我的服务器会打印,它已经收到了行,并且可能会发送回响应,但是PHP代码不会打印任何内容

有什么问题吗

先谢谢你


另外,可能值得一提的是,我是通过AJAX访问此网页的,因此它会将结果“回显”到另一个网页。

尝试在
fsockopen()之后添加:


我的朋友给我发了这个链接,里面有一个很好的代码,可以实现这个功能。里面有一个技巧可以解决问题

下面的代码可以工作。诀窍是添加chr(13)。chr(10)到字符串的末尾

$str.= chr(13) . chr(10);
stream_set_blocking($fp,0);
$info=stream_get_meta_data($fp);
if ($fp) {
    fputs($fp,$str);
    $reply='';
    while (!feof($fp) && !$info['timed_out']) {
        $reply.= fread($fp, 1);
    }
    echo $reply;
}

我个人更喜欢
socket.*
函数。但无论哪种方式,您都可能缺少对终止字符的检查:

$sock = socket_create(AF_INET, SOCK_STREAM, 0);
socket_connect($sock, $host, $port);

socket_write($sock, $str);

$response = '';
while($resp = socket_read($sock, 1024)) {
    if(!$resp)
        break;
    $response .= $resp;
    if(strpos($resp, "\n") !== false)
        break;
}

echo "Server said: {$response}";

现在阻塞消失了,但我仍然无法从fgets()中获得任何信息。服务器似乎希望看到以换行符结尾的字符串。您是否尝试过fputs($fp,$str.“\n”)?Java服务器得到$str,就像我现在得到的一样,没有“\n”,但是PHP服务器没有得到字符串,尽管在Java中,最后发送了一个put“\n”。有关更全面的解决方案,请参阅我的回复。这不是一个“把戏”
BufferedReader.readLine()
读取直到看到回车符或换行符,这分别是
chr(13)
chr(10)
的含义。见:
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
socket_connect($sock, $host, $port);

socket_write($sock, $str);

$response = '';
while($resp = socket_read($sock, 1024)) {
    if(!$resp)
        break;
    $response .= $resp;
    if(strpos($resp, "\n") !== false)
        break;
}

echo "Server said: {$response}";