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