2013-11-12 3 views
1

У меня есть сервер socket.io (в node.js), с которым я пытаюсь подключиться к клиенту python, в основном для обеспечения интерфейса командной строки для моего сервер сокетов.Подключение клиента Python к Socket.io с пользовательскими событиями socket.io

Я использую веб-сокеты Python, однако я понял, что это поддерживает только четыре «события»: при открытии, при закрытии, при ошибке и при сообщении.

Мой сервер socket.io определяет пользовательские события, такие как .on('connection'). Как я могу испускать/получать такие настраиваемые события в python?

Вот мой сценарий до сих пор, который только начинается и закрывается, и поэтому он не работает. импорта веб-сокетов, запросы, нить, время хост = «http://socket-url-server.com»

def on_open(ws): 
    def run(*args): 
     print 'did connect' 
     for i in range(3): 
      time.sleep(1) 
      result = ws.recv() 
      print 'received:' 
      print result 
     time.sleep(1) 
     ws.close() 
     print "thread terminating..." 
    thread.start_new_thread(run,()) 

def on_message(ws, message): 
    print message 

def on_error(ws, error): 
    print error 

def on_close(ws): 
    print "### closed ###" 

print('Connecting to %s' % host) 

socket = host.replace('http://', 'ws://') 
print socket 
websocket.enableTrace(True) 
_ws = websocket.WebSocketApp(socket, 
          on_message = on_message, 
          on_error = on_error, 
          on_close = on_close) 
_ws.on_open = on_open 
_ws.run_forever() 

Какая библиотека/метод следует использовать иначе? Если я сделаю рукопожатие и возьму сам ключ сервера socket.io, как я могу испускать/получать события после этого?

Я также попытался с помощью https://pypi.python.org/pypi/socketIO-client, но документация очень беден

Я написал следующий сценарий для него ниже, но я получаю No handlers could be found for logger "socketIO_client" и он просто висит вечно.

from socketIO_client import SocketIO, BaseNamespace 

class Namespace(BaseNamespace): 

    def on_connect(self): 
     print '[Connected]' 

socketIO = SocketIO('http://socket-server-url.com', 80, Namespace) 
socketIO.wait(seconds=1) 

ответ

1

Я столкнулся с тем же вопросом и сам работал над этой проблемой. здесь я написал несколько комментариев относительно использования библиотеки socketIO_client и надеюсь, что это поможет.

развивающей среды: Сервер/Клиент: nodejs/sio_client написанного питона

  1. «Нет обработчики не может быть найден регистратор„socketIO_client“. Это означает, что он нуждается в обработчик для лесозаготовительного материала Попробуйте.» протоколирования импорта; logging.basicConfig (уровень = logging.DEBUG) "и журнал.
  2. „socketio_client висит навсегда“, так как это держать повторное подключение к указанному серверу бесконечно, т.е. пространства имен объекта не будет принят до socketIO объекта не является инициализировать объект socketio и main-thread использовать очередь, включенную в пространство имен, чтобы проверить, есть ли ответы от сервера. Кажется, что ваш сервер должен быть доступен все время перед запуском вашего sio_client, в противном случае он будет восстанавливать соединения, если вы не остановите программу. Хотя вы можете установить wait_for_connection как True, чтобы остановить его, вы должны обрабатывать socketI O_client.exceptions.ConnectionError самостоятельно.

FYI

[2014/02/19] Извините, позвольте мне добавить некоторые комментарии к моим ответам в отношении к py_SIOClient.

Пример кода, как это:

class ChatNamespace(BaseNamespace): 
    def on_connect(self): 
     print "connected." 
    def on_sayhello_response(self, data): 
     print "response:", data 

sio = SocketIO(host, port, ChatNamespace) 
chatns = sio.define(ChatNamespace, '/chat') 

while (1): 
    chatns.emit('sayhello', {'name':'John'}) 
    chatns.wait(1) 

Команда «SayHello» в этом примере будет неактивной, когда соединение не будет сброшено, и объект chatns пространства имен больше не доступна (ошибка не возникла ни).Поэтому его можно было бы обработать путем повторного определения выделенного пространства имен каждый раз перед выпуском сообщения, поскольку мы не знаем, когда соединение будет сброшено (и это не имеет значения, на мой взгляд). Надеюсь, это поможет людям, работающим над py_SocketIO_Client.

ДОПОЛНЕНИЕ 2014/09/09 Как я узел (.js) в качестве серверного сервера, но эта библиотека, кажется, не обновление в течение нескольких месяцев, и его socket.io поддерживает только socket.io < 1.0. 0. Напомните, пожалуйста, чтобы проверить версию своего пакета, прежде чем выбирать эту библиотеку. Надеюсь, что это поможет ppl столкнуться с такой же проблемой, как у меня.

+0

На самом деле я хотел оставить комментарий, но мой кредит не позволил бы мне это сделать. Я ответил на это. –

+0

Кстати, вы должны позволить объекту SIO ждать каждый раз, когда вы излучаете сообщение, иначе он не будет работать должным образом. Я все еще смущен его целью. –

Смежные вопросы