3

这里先介绍一些背景。

  1. 我的目标是使用 Ratchet WebSockets 创建双向客户端-服务器通信。

  2. 我已经安装了棘轮和随附的软件,如此所述。

  3. 我已经成功地创建了一个 Hello World 应用程序,如此所述。

  4. 现在我正在尝试使用教程创建推送功能。我已经复制了代码,稍作修改(在下面的代码注释中注明了修改),安装了 ZMQ 库(最新版本,将其添加到 php.ini,显示在php -m- 简而言之,它已正确安装)。但是 WebSocket 不起作用。

我将在下面提供我的测试过程以及指向我的域的真实链接,以便您自己检查。

  1. 我的推送服务器和他们教程中的一模一样,只是将 IP 更改为我服务器的 IP。我通过 SSH 运行它,它似乎连接正确。

  2. 我的 Pusher 类位于 MyApp 命名空间中,与他们的教程中的代码和相对位置相同。

  3. 我的 post.php 稍作修改,因为无需担心 MySQL 查询:

$entryData = array(        //hard-coded content of $entryData for simplicity
    'cat'     => "macka"
  , 'title'   => "naslov"
  , 'article' => "tekst"
  , 'when'    => time()
);

// This is our new stuff
$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'my pusher');
$socket->connect("tcp://light-speed-games.com:5555");       //my domain, still using port 5555 as in their example

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

该文件位于此处

  1. 我的 client.php 与他们的相同,除了我必须为 IE 添加一些修复以使用when.js. 我的问题与浏览器无关,与添加修复程序之前的问题相同。
<script>
    window.define = function(factory) {    //my addition
        try{ delete window.define; } catch(e){ window.define = void 0; } // IE
        window.when = factory();
    };
    window.define.amd = {};
</script>
<script src="/apps/scripts/when.js"></script> 
<script src="http://autobahn.s3.amazonaws.com/js/autobahn.min.js"></script>
<script>
    var conn = new ab.Session(
        'ws://light-speed-games.com:8080' // The host (our Ratchet WebSocket server) to connect to
      , function() {            // Once the connection has been established
            conn.subscribe('kittensCategory', function(topic, data) {
                // This is where you would add the new article to the DOM (beyond the scope of this tutorial)
                console.log('New article published to category "' + topic + '" : ' + data.title);
            });
        }
      , function() {            // When the connection is closed
            console.warn('WebSocket connection closed');
        }
      , {                       // Additional parameters, we're ignoring the WAMP sub-protocol for older browsers
            'skipSubprotocolCheck': true
        }
    );
</script>

该文件位于此处

理论上,应该发生什么(例如):我在​​打开client.php控制台的情况下在 Chrome 中打开;然后我post.php在 Firefox 中打开;Chrome 的控制台应显示消息“新文章已发布...”等(来自 中的conn.subscribe函数client.php)。但是,当我这样做时,什么也没有发生。push-server.php连接保持打开状态(在我通过 SSH关闭之前不显示“连接关闭”错误)。控制台仍然是空的。

我认为这是过去几天的所有相关信息,其中很大一部分我都花在了试图弄清楚这一点上。但是,我什至无法确定问题出在代码上还是与我可能不知道的某些服务器配置设置有关。所以,我来找你,希望有人能指出我正确的方向。

重要编辑

我很确定问题在于 Autobahn.js 方法conn.subscribe无法正常工作。正在建立连接。当我将代码更改为:

function() {            // Once the connection has been established
            console.log('Connection established');
            conn.subscribe('kittensCategory', function(topic, data) {
                // This is where you would add the new article to the DOM (beyond the scope of this tutorial)
                console.log('New article published to category "' + topic + '" : ' + data.title);
            });
        }

然后Connection established正确显示在控制台中。所以我相信我们需要对订阅方法进行故障排除。如果有人可以向我解释它是如何工作的,以及“主题”和“数据”到底应该是什么,那将有很大帮助。Autobahn 文档使用 URL 作为此方法的参数(请参阅此处)。

4

2 回答 2

7

您的客户正在寻找一篇文章kittensCategory,但您正在发送类别macka。试试这个:

$entryData = array(
    'cat'     => "kittensCategory",
    'title'   => "naslov",
    'article' => "tekst",
    'when'    => time()
);
于 2013-12-25T15:05:52.260 回答
4

看到您的主机 light-speed-games.com 在端口 8080 上没有运行是否正确?如果没有,我建议解决此问题,因为它可能会导致您的问题。

于 2013-12-31T10:57:26.547 回答