У меня есть приложение, которое подключается к веб-странице, которая отправляет и получает текстовые строки через websocket на порту 1234. У меня нет доступа к интерфейсу, поэтому я не могу изменить код внешнего интерфейса HTML. Я создал сервер autobahn с классом, производным от протокола WebSocketServer, который обменивается данными с веб-страницей через порт 1234. Это работает, и я могу отправлять и получать текст на передний план. Однако мне нужно обработать входящие данные и вы хотите опубликовать полученные данные в контейнер crossbar.io через маршрутизатор на порту 8080 (или любой другой порт). Порт для веб-браузера фиксирован в 1234. Это способ для меня «подключить» сервер веб-сервера autobahn к перекрестному маршрутизатору или есть альтернативный способ создания сервера веб-сервера, который позволит мне отправлять и получить текст на порту 1234 и в то же время участвовать в pub/sub и RPC с помощью кросс-маршрутизатора?connect autobahn websocket server to crossbar.io router
ответ
Я предполагаю, что вы используете Python. Если вы этого не сделаете, ответ должен быть тем же, но в зависимости от языка/библиотеки и его реализации ответ может измениться.
От того, что вы говорите, это звучит не так, как будто вам действительно нужен «плагин». У поперечины есть их под описанием router components. Но если вам не нужно подключать экземпляр Python непосредственно к маршрутизатору либо для производительности, либо для другого, я бы рекомендовал сохранить приложение с маршрутизатора. Он будет отлично работать как отдельный экземпляр, особенно если он находится на том же компьютере, на котором размещен маршрутизатор WAMP, где пакеты будут требовать только для связи через loopback (что очень быстро).
Учитывая, что вы используете Python:
Вы можете использовать WebSocketServer и WampApplicationServer вместе. Маленькая икота, с которой вы можете столкнуться, запускает их правильно. В любом сценарии Python2.x с витой или Python3.4 с Asyncio вы можете только запустить цикл реактора/события один раз или произойдет ошибка. (И Twisted, и Asyncio имеют одинаковую базовую концепцию). В Asyncio вы получите RuntimeError: Event loop is running.
, если вы попытаетесь дважды запустить цикл событий. Аналогичная ошибка наблюдается у Twisted. Используя ApplicationRunner в скрученном состоянии, есть опция (второй аргумент в run
), чтобы не запускать реактор, который вы можете использовать после того, как реактор уже запущен. В Asyncio такой опции нет, единственный способ узнать, как это сделать, - наследовать Application runner и перезаписать метод 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();