我正在尝试从我在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
这是预期的。
答案 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字节,您将看到该脚本不再挂起。