PHP挂在socket_read上

时间:2012-01-06 18:53:15

标签: java php sockets

我正在尝试从我在Java应用程序上编写的套接字读取响应。然而,PHP只是悬挂。这是我用来从套接字读取的代码:

while($resp = socket_read($socket, 1000)) {
   $str .= $resp;
   if (strpos($str, "\n") !== false) {
        break;
   }
}

当我从终端运行套接字调用时,会有一个响应。这就是我在Java中的响应代码:

out.println(request.seed);

其中request.seed是int。我也尝试过:

out.println(request.passcode + "\n");

但这并没有解决问题。


当我在终端中请求以下内容时:

josephs-macbook:~ jf$ echo "pairBankRequest|userID=305,bankID=12," | nc 127.0.0.1 3030

我收到以下回复:

830039

这是预期的。

3 个答案:

答案 0 :(得分:1)

在PHP客户端程序中,在套接字写入和读取之间插入usleep(500)

答案 1 :(得分:0)

从PHP手册:

  

可选的type参数是一个命名常量:

     

PHP_BINARY_READ(默认) - 使用系统recv()函数。安全地读取二进制数据。     PHP_NORMAL_READ - 读取停在\ n或\ r。

来源: http://www.php.net/manual/en/function.socket-read.php

您是否尝试过使用PHP_NORMAL_READ作为socket_read()的第三个参数?这也不需要检查strpos($str, "\n")...

只是在黑暗中拍摄,但我会尝试。

修改

以下是一段适用于我的代码:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

...
// connecting the socket, etc
...

$result = '';
$numBytes = 100;
$numRead = 0;

while ($numRead < $numBytes)
{
  $tmp = socket_read($socket, $numBytes - $numRead, PHP_BINARY_READ);
  if ($tmp === false)
  {
    $error = socket_last_error();
    socket_close($socket);
    $socket = null;
    throw new Exception('Read error ('.$error.')');
  }
  $numRead += strlen($tmp);
  $result.= $tmp;
}

答案 2 :(得分:0)

您的代码挂起的原因是因为您的缓冲区大于发送的数据。

如果将缓冲区从1000字节降低到1字节,您将看到该脚本不再挂起。