我正在使用TCP/IP连接到用JAVA编写的服务器。我的应用程序将 json 数组发送到此服务器,在某些情况下还期望一些结果,即 json 数组。问题是我可以通过 tcp 轻松发送 json,但是在读取它时,脚本会永远冻结等待,直到超时。这是我的代码。
$sock = socket_create(AF_INET, SOCK_STREAM, 0) //Creating a TCP socket
or die("error: could not create socket'n");
$succ = socket_connect($sock, Application_Model_Config::serverHost, Application_Model_Config::serverPort) //Connecting to to server using that socket
or die("error: could not connect to host'n");
socket_write($sock, $send.''n', strlen($send)+1);
$response = '';
while ($resp = socket_read($sock, 1024)) {
if (!$resp)
break;
$response .= $resp;
if (strpos($resp, "'n") !== false)
break;
}
echo "Server said: {$response}";
}
$send是一个编码为 json_encode($array) 的数组。
发送是可以的,但是当需要接收时,我什么也得不到。
如果可能的话,我不介意使用 jquery(从服务器发送和获取 json 对象)来处理这个问题。我不知道有任何实现这样的事情的实现,但我愿意接受建议......实际上更喜欢它而不是PHP。
在你使用的模式中 socket_read
,它具有与recv
相同的语义:
如果套接字上没有可用的消息,则接收调用将等待消息到达,除非套接字是非阻塞的(请参阅
fcntl(2)
),在这种情况下,返回值 -1 并将外部变量设置为EAGAIN
errno
。接收调用通常返回任何可用数据,最多返回请求的数量,而不是等待收到请求的全部数据量。
因此,如果脚本"永远等待直到超时",那是因为没有数据可读取。您可以使用数据包嗅探器确认这一点。