【问题标题】:PHP hanging on socket_readPHP 挂在 socket_read 上
【发布时间】:2012-02-04 11:33:28
【问题描述】:

我正在尝试从我在 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

这是预期的。

【问题讨论】:

    标签: java php sockets


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        来自 PHP 手册:

        可选类型参数是一个命名常量:

        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")... 的需要。

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

        编辑:

        这是一个适合我的sn-p代码:

        $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;
        }
        

        【讨论】:

        • 嗯。你知道你从套接字读取的字节数吗?
        • 返回的只是一个 6 位数字。我添加了一个额外的字符串来增加长度并将 $numBytes 设置为 1 但仍然是同样的问题。
        • 我已经添加了套接字创建代码。你使用相同的参数吗?
        • 你说这在你从终端运行时有效。你能描述一下不同之处吗?
        • 你从 socket_write() 得到的返回值是多少?
        猜你喜欢
        • 2012-07-14
        • 2013-06-21
        • 2013-07-26
        • 2010-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多