【问题标题】:connecting autobahn websocket server to crossbar.io router将高速公路 websocket 服务器连接到 crossbar.io 路由器
【发布时间】:2015-03-14 15:50:29
【问题描述】:

我有一个连接到网页的应用程序,该网页通过端口 1234 上的 websocket 发送和接收文本字符串。我无权访问前端代码,因此无法更改 HTML 前端代码。 我创建了一个高速公路服务器,其类派生自 WebSocketServer 协议,该协议通过端口 1234 与网页通信。这有效,我能够向前端发送和接收文本。 但是,我需要处理传入的数据,并希望通过端口 8080(或任何其他端口)上的路由器将接收到的数据发布到 crossbar.io 容器。 Web 浏览器的端口固定为 1234。 我有办法将高速公路 websocket 服务器“插入”到交叉开关路由器中,或者是否有另一种方法可以创建 websocket 服务器,允许我在端口 1234 上发送和接收文本并同时参与在 pub/sub 和 RPC 中使用 crossbar 路由器?

【问题讨论】:

    标签: autobahn crossbar


    【解决方案1】:

    我假设您使用的是 Python。如果不是,答案应该仍然相同,但取决于语言/库及其实现,答案可能会发生变化。

    从你所说的,听起来你并不需要一个“插件”。 Crossbar 在router components 的描述下确实有这些。但除非您真的出于性能或其他原因需要将 Python 实例直接附加到路由器,否则我建议您将应用程序远离路由器。作为一个独立的实例,它可以很好地工作,特别是如果它位于 WAMP 路由器所在的同一台机器上,数据包只需要通过loopback 进行通信(这非常快)。

    鉴于您使用的是 Python:

    您可以同时使用 WebSocketServer 和 WampApplicationServer。您可能会遇到的小问题是正确启动它们。在 Python2.x 和 Twisted 或 Python3.4 和 Asyncio 的任何一种情况下,您只能启动一次反应器/事件循环,否则会出现错误。 (Twisted 和 Asyncio 具有相同的基本概念)在 Asyncio 中,如果您尝试启动事件循环两次,您将得到 RuntimeError: Event loop is running.。 Twisted 也有类似的错误。在 twisted 中使用 ApplicationRunner,有一个选项(run 中的第二个参数)不启动反应器,您可以在反应器已经运行后使用它。在 Asyncio 中,没有这样的选项,我发现如何做到这一点的唯一方法是继承 Application 运行器并覆盖 run 方法以启动要作为任务启动的会话。另外,请注意,除非正确包装,否则线程不会与任一事件循环合作。

    一旦您在一个实例中设置了两个连接,您就可以对数据做任何您想做的事情。

    【讨论】:

      【解决方案2】:

      感谢您的想法,您提到的问题正是我遇到的。然而,我确实找到了一个解决方案,并且由于 crossbar 的灵活性,创建了一个 JavaScript 来宾,它允许我做我需要的事情。代码如下:

      // crossbar setup
      var autobahn = require('autobahn');
      
      var connection = new autobahn.Connection({
              url: 'ws://127.0.0.1:8080/ws',
              realm: 'realm1'
          }
      );
      
      // Websocket to Scratch setup
      // pull in the required node packages and assign variables for the entities
      var WebSocketServer = require('websocket').server;
      var http = require('http');
      
      var ipPort = 1234; // ip port number for Scratch to use
      
      // this connection is a crossbar connection
      connection.onopen = function (session) {
      
          // create an http server that will be used to contain a WebSocket server
          var server = http.createServer(function (request, response) {
              // We are not processing any HTTP, so this is an empty function. 'server' is a wrapper for the
              // WebSocketServer we are going to create below.
          });
      
          // Create an IP listener using the http server
          server.listen(ipPort, function () {
              console.log('Webserver created and listening on port ' + ipPort);
          });
      
          // create the WebSocket Server and associate it with the httpServer
          var wsServer = new WebSocketServer({
              httpServer: server
          });
      
          // WebSocket server has been activated and a 'request' message has been received from client websocket
          wsServer.on('request', function (request) {
              // accept a connection request from Xi4S
              //myconnection is the WS connection to Scratch
              myconnection = request.accept(null, request.origin); // The server is now 'online'
      
              // Process Xi4S messages
              myconnection.on('message', function (message) {
      
                  console.log('message received: ' + message.utf8Data);
                  session.publish('com.serial.data', [message.utf8Data]);
      
                  // Process each message type received
                  myconnection.on('close', function (myconnection) {
                      console.log('Client closed connection');
                      boardReset();
                  });
              });
          });
      };
      
      connection.open();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-16
        相关资源
        最近更新 更多