消息未通过ZMQ发送

时间:2014-06-09 11:38:58

标签: php zeromq

目前,我正在尝试使用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.理想情况下应该有一个(当前)。但是在建立连接时不会抛出任何异常。 有什么我想念的吗?

2 个答案:

答案 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中不可见,因此很可能存在问题。