PHP Socket Java消息交换

时间:2010-11-12 15:32:22

标签: java php sockets

我正在尝试在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代码不会打印任何内容。

可能是什么问题?

提前谢谢。

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

3 个答案:

答案 0 :(得分:1)

尝试在fsockopen()之后添加:

stream_set_blocking($fp,0);
$info=stream_get_meta_data($fp);
if ($fp) {
    fputs($fp,$str);
    $reply=''.
    while (!feof($fp) && !$info['timed_out']) {
        $reply.=fgets($fp);
    echo $reply;
}
close($fp);

答案 1 :(得分:1)

我个人更喜欢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}";

答案 2 :(得分:0)

我的朋友发送了这个链接http://abejali.com/?p=56,其中包含一个非常好的代码。内部有一个技巧可以解决问题

以下代码有效。诀窍是添加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;
}