node.js socket.io-клиент + сокет python

Я пытаюсь использовать Socket.IO, чтобы разрешить моему приложению Node.JS взаимодействовать с бэкэндом Python. Я хочу, чтобы Node.JS действовал как клиент, а Python — как сервер, поэтому я использую модуль socket.io-client Node.JS в дополнение к модулю Python gevent-socketio.

https://github.com/LearnBoost/socket.io-client https:// github.com/abourget/gevent-сокетио

Вот мой сервер Python:

#!/usr/bin/env python
from socketio.server import SocketIOServer
from socketio.namespace import BaseNamespace

class MyNamespace(BaseNamespace):
    def on_foobar(self,data):
        print 'received method for foobar'
        print data


server = SocketIOServer(('localhost', 1234),resource=MyNamespace,policy_server=False)
print 'SocketIO server listening...'
server.serve_forever()

Вот мой сервер Node.JS (действующий как клиент):

#!/usr/bin/env node
var io = require('socket.io-client');
var PySocket = io.connect('localhost:1234');
PySocket.emit('foobar',{'key1':'value1'});

По какой-то причине сервер python не видит соединение. может ли кто-нибудь указать, что мне не хватает?


person ejang    schedule 13.09.2012    source источник


Ответы (1)


Вам понадобится немного больше на стороне Python.

Объект Namespace не должен передаваться в качестве параметра объекту SocketIOServer. Этот resource (позже переименованный в namespace) — это только имя пути, который нужно распознать (например, http://localhost/[namespace]/[остальная часть пути протокола socket.io]. Я согласен, что терминология частично совпадает, но мы редко имеем дело с ресурсом/пространством имен, отличным от socket.io.

Теперь, чтобы ваш сервер ввода-вывода на Python запустился, вам нужно обернуть его с помощью какой-либо структуры... чтобы фактически отправить некоторый входящий запрос правильному обработчику. Этот обработчик должен выполнить socketio_manage(), и это функция, в которую вы должны передать свой объект пространства имен в качестве параметра. Кроме того, ваша структура, вероятно, захочет обслуживать другие файлы, такие как .swf... gevent-socketio не сделает этого за вас. Кроме того, если вы хотите, чтобы ваш процесс Python что-то делал (например, взаимодействовал с базами данных, загружал некоторые файлы конфигурации), я рекомендую вам выбрать фреймворк, так как он облегчит вашу жизнь практически для всего, что вам нужно сделать.

Если вы действительно хотите иметь сервер типа socket, от node.js до python, то почему бы не использовать стандартные сокеты TCP/UDP? В этом случае вам не понадобятся накладные расходы на фреймворк, кодирование/декодирование протокола Socket.IO и т. д.

Каков ваш конкретный вариант использования? Возможно, это могло бы пролить свет на дальнейший путь.

person abourget    schedule 14.09.2012
comment
Конкретный вариант использования = простая связь между node.js и python. Мне не нужно обслуживать .swf или любой другой контент, поэтому я решил, что мне не нужен фреймворк. - person ejang; 14.09.2012
comment
TCP/UDP немного раздражает, потому что мне нужно отслеживать размеры буфера и тому подобное. есть ли более простая библиотека сокетов? - person ejang; 14.09.2012
comment
Кроме того, функция socket.io emit() полезна, потому что я могу указать метод, на который питон может реагировать конкретно, без необходимости анализировать определенные флаги из данных. Я не думаю, что это возможно с обычными сокетами, если только я не устанавливаю соединения на несколько портов, что немного раздражает. - person ejang; 14.09.2012
comment
Тогда используйте систему очередей сообщений. Redis pubsub или RabbitMQ для более сложных случаев - person abourget; 08.11.2012