将autobahn websocket服务器连接到crossbar.io路由器

时间:2015-03-14 15:50:29

标签: autobahn crossbar

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

2 个答案:

答案 0 :(得分:0)

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

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

鉴于您使用的是Python:

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

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

答案 1 :(得分:0)

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