将高速公路网络套接字服务器连接到 crossbar.io 路由器



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

我假设你正在使用Python。如果你不是,答案应该仍然是一样的,但根据语言/库及其实现,答案可能会改变。

从你所说的,听起来你真的不需要"插件"。横杆在路由器组件的描述下确实有这些。但是,除非您确实需要将 Python 实例直接附加到路由器以提高性能或其他方面,否则我建议您将应用程序远离路由器。它可以作为独立实例完美运行,特别是如果它位于WAMP路由器所在的同一台计算机上,数据包只需要通过环回进行通信(非常快)。

鉴于您使用的是 Python:

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

在一个实例中设置两个连接后,您可以对数据执行任何操作。

感谢您的想法,您提到的问题正是我遇到的。然而,我确实找到了一个解决方案,并且由于交叉栏的灵活性,创建了一个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();

最新更新