React/ZMQ/Ratchet - Websocket 服务器响应

Posted

技术标签:

【中文标题】React/ZMQ/Ratchet - Websocket 服务器响应【英文标题】:React/ZMQ/Ratchet - Websocket server response 【发布时间】:2014-05-26 17:56:36 【问题描述】:

我目前正在运行并使用 Ratchet php 的 Web 套接字服务器。我不是在我希望外部脚本与我的服务器进行通信的阶段。我可以使用 ZMQ 成功地将数据推送到它:

push.php

$json = ['name' => 'Joe Bloggs'];

$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'Push Notification');
$socket->connect("tcp://localhost:5555");

$socket->send(json_encode($json));

然后在我的网络服务器脚本中,我可以将它发送到一个方法 (onNewPush),以便在运行 push.php 文件时对其进行处理(运行?):

...
$push = $context->getSocket(ZMQ::SOCKET_PULL);
$push->bind('tcp://127.0.0.1:5555');
$push->on('Push Notification', array($pusher, 'onNewPush'));
...

所以这工作正常,但我在尝试收到回复时遇到了麻烦。我正在尝试类似:

pull.php

$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_REQ, 'Pull Notification');
$socket->connect("tcp://localhost:5554");

$socket->send('data');

echo $socket->recv();

然后在我的服务器脚本中:

$pull = $context->getSocket(ZMQ::SOCKET_PULL);
$pull->bind('tcp://127.0.0.1:5554');
$pull->on('message', array($pusher, 'onPull'));

我的$pusher 变量加载了我的文件,该文件实现了一些棘轮接口。但本质上我只是返回一个字符串:

public function onPull()

    return "some data";

运行 pull.php 时出现错误:

Fatal error: Uncaught exception 'ZMQSocketException' with message 'Failed to receive message: Not supported' in websockets\pull.php:9 Stack trace: #0 websockets\pull.php(9): ZMQSocket->recv() #1 main thrown in websockets\pull.php on line 9

有人知道为什么吗?

getSocket() 上的第二个参数还有什么重要性?就像一个永远不会再使用的字符串。

干杯

更新

【问题讨论】:

【参考方案1】:

在您的 pull.php 文件中,您有一个 REQ 套接字连接到一个 PULL 套接字。 Check out the docs 查看兼容的套接字对。特别是,您似乎需要一个 REQ-REP 对,以便您的客户端可以请求数据,而您的服务器会回复一个响应。如果您的服务器为下一个客户端准备好数据排队,然后您的客户端从队列中提取下一个数据,您将使用 PUSH-PULL

在任何一种情况下,您都不能将REQ 套接字连接到PULL 套接字或PUSH 套接字。

我不完全了解您列出的代码或命名方案的用例或通信架构,所以我不知道我能提供多少细节,请随时澄清发生了什么,我可能会能够更明确地建议您应该使用哪种套接字策略。

【讨论】:

是的,我决定阅读并在昨晚发现了这一点。我得到了 REQ REP 序列,但它只工作了一次(我的拉脚本中的任何其他请求都刚刚挂起)。基本上我的用例是:在与 Web 套接字服务器相同的服务器上拥有一个静态 PHP 脚本,并且在 cron 作业中每 30 秒脚本将当前连接的用户获取到我的网络服务器。为了清楚起见,我决定写一个新问题,还没有回复:***.com/questions/23891538/… 如果您不再遇到此问题中的问题,您应该接受解决了您的问题的答案,或者自己编写并接受它,这样问题就不会悬而未决.【参考方案2】:

你的 pull.php 中有这一行:

echo $socket->recv();

推送套接字用于发送消息,而不是接收消息。这可能就是异常的来源。

另外:方法on()的第一个参数应该是'message'

$pull->on('message', array($pusher, 'onPull'));

【讨论】:

再次感谢。我更新了我的 pull.php 以使用 ZMQ::SOCKET_PULL(在此位上找不到任何文档)并删除了 send 部分,现在我的脚本只是执行但不会停止。不知道如何得到回复......嗯。

以上是关于React/ZMQ/Ratchet - Websocket 服务器响应的主要内容,如果未能解决你的问题,请参考以下文章

WebSocket 教程

(转)WebSocket学习

WebSocket简介

websockets django nginx webssh

WebSocket 实战

springboot整合websocket