目前,我正在尝试使用ZMQ发送/接收消息的简单代码。代码如下
/* Create new queue object, there needs to be a server at the other end */
$queue = new ZMQSocket(new ZMQContext(), ZMQ::SOCKET_REQ);
$queue->connect("tcp://127.0.0.1:5555");
/* Assign socket 1 to the queue, send and receive */
$retries = 5;
$sending = true;
/* Start a loop */
do {
try {
/* Try to send / receive */
if ($sending) {
echo "Sending message\n";
$queue->send("This is a message", ZMQ::MODE_NOBLOCK);
$sending = false;
} else {
echo "Got response: " . $queue->recv(ZMQ::MODE_NOBLOCK) . "\n";
echo 'Complete';
break;
}
} catch (ZMQSocketException $e) {
/* EAGAIN means that the operation would have blocked, retry */
if ($e->getCode() === ZMQ::ERR_EAGAIN) {
echo " - Got EAGAIN, retrying ($retries)\n";
} else {
die(" - Error: " . $e->getMessage());
}
}
/* Sleep a bit between operations */
usleep(5);
} while (--$retries);
当我在控制台中运行此脚本时,我的输出是
Sending message
Got response:
Complete
我相信尽管没有抛出任何错误,但我的消息仍未实际发送。我还运行了netstat
命令,但我没有发现任何进程正在侦听端口5555.理想情况下应该有一个(当前)。但是在建立连接时不会抛出任何异常。
有什么我想念的吗?
答案 0 :(得分:0)
如果您说没有进程正在侦听端口5555,则可能意味着您的服务器未启动并正在运行。即使没有服务器,您的客户也不会抛出任何错误,它只是设置并等待服务器联机(至少在此处使用您的特定设置)。
在这种情况下,由于您正在使用非阻止模式,它会在第一次通过循环时发送您的消息(为什么要在循环中发送消息?),但是它实际上不会发送任何东西,因为服务器不在那里。然后它会尝试在第二次通过循环时接收,但由于套接字不准备接收它,看起来它只是静默失败,而不会抛出异常。由于没有抛出任何异常,它会进入break语句,退出循环,然后你就完成了。
首先,您的send
来电应该在循环之前发生,而您只想做一次。
然后,当您recv
时,将结果存储在变量中并测试空虚。保留try / catch代码。结果应该是这样的:
/* Create new queue object, there needs to be a server at the other end */
$queue = new ZMQSocket(new ZMQContext(), ZMQ::SOCKET_REQ);
$queue->connect("tcp://127.0.0.1:5555");
/* Assign socket 1 to the queue, send and receive */
$retries = 5;
echo "Sending message\n";
$queue->send("This is a message", ZMQ::MODE_NOBLOCK);
/* Start a loop */
do {
try {
/* Try to receive */
$response = $queue->recv(ZMQ::MODE_NOBLOCK);
if (!empty($response)) {
echo "Got response: " . $response . "\n";
echo 'Complete';
break;
}
else {
echo "we probably haven't even sent the original request yet, retrying ($retries)\n";
}
}
catch (ZMQSocketException $e) {
/* EAGAIN means that the operation would have blocked, retry */
if ($e->getCode() === ZMQ::ERR_EAGAIN) {
echo " - Got EAGAIN, retrying ($retries)\n";
} else {
die(" - Error: " . $e->getMessage());
}
}
/* Sleep a bit between operations */
usleep(5);
} while (--$retries);
echo "END OF LINE";
...请记住,这是对客户端代码的一个小修复,使其行为更加合理,我仍然认为您的实际问题是服务器没有运行。
答案 1 :(得分:0)
请添加服务器代码。您正在显示客户端代码。由于问题似乎在服务器中,并且您还声明服务器在netstat中不可见,因此很可能存在问题。