【问题标题】:PHP Socket Java message exchangePHP Socket Java 消息交换
【发布时间】:2011-05-09 03:32:16
【问题描述】:

我正在尝试在 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 访问此网页,因此它会将结果“回显”回其他页面。

【问题讨论】:

    标签: java php sockets


    【解决方案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】:

      尝试在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);
      

      【讨论】:

      • 现在阻塞消失了,但我仍然没有用 fgets() 得到任何东西。
      • 似乎服务器需要一个以换行符结尾的字符串。你试过fputs($fp,$str."\n"); 吗?
      • Java 服务器获取我现在拥有的 $str,没有 "\n"
      • PHP 服务器没有取回字符串,尽管在 Java 中发送一个“\n”最后。
      • 查看我的回复以获得更全面的解决方案
      【解决方案3】:

      我的朋友给我发了这个链接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;
      }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      相关资源
      最近更新 更多