cherrypy как сервер gevent-socketio

Я только начал использовать gevent-socketio, и это здорово!

Но я использовал socketioserver и socketio_manage по умолчанию из учебника по чату, и мне было интересно, как интегрировать socketio с cherrypy.

по существу, как мне включить это:

class MyNamespace(BaseNamespace):...

def application(environ, start_response):
    if environ['PATH_INFO'].startswith('/socket.io'):
        return socketio_manage(environ, { '/app': MyNamespace})
    else:
        return serve_file(environ, start_response)

def serve_file(...):...

sio_server = SocketIOServer(
    ('', 8080), application, 
    policy_server=False) sio_server.serve_forever()

в обычный cherrypy server?


person WindowsMaker    schedule 07.08.2012    source источник


Ответы (2)


Gevent-socketio основан на Gevent и веб-сервере Gevent. Есть две реализации: pywsgi, который представляет собой чистый python, и wsgi, который использует реализацию http из libevent.

См. абзац, начинающийся с «Разница между pywsgi.WSGIServer и wsgi.WSGIServer» здесь:

http://www.gevent.org/servers.html

Только эти серверы являются «зелеными» в том смысле, что они передают управление циклу Gevent ... поэтому вы можете использовать только эти серверы на самом деле. Причина этого в том, что сервер присутствует в самом начале запроса и будет знать, как обрабатывать согласование протоколов «Обновление» и веб-сокеты, и он будет передавать значения внутри «среды», которую следующий уровень (SocketIO) будет ожидать и знать, как обращаться.

Вам также нужно будет использовать пакет gevent-websocket... потому что он зеленый (и gevent-socketio основан на нем). Вы не можете просто поменять местами стек веб-сокетов.

Надеюсь это поможет.

person abourget    schedule 08.08.2012

CherryPy не реализует протокол socket.io и не поддерживает встроенный WebSocket. Однако существует расширение CherryPy, называемое ws4py, которое реализует только голый протокол WebSocket. поверх своего стека. Вы могли бы начать там, вероятно.

person Sylvain Hellegouarch    schedule 08.08.2012
comment
Вы не можете просто поменять местами слой websocket и по-прежнему использовать gevent-socketio. Он ожидает gevent-websocket и должен работать на сервере на основе Gevent. - person abourget; 08.08.2012
comment
Я вообще это сказал? Вопрос заключался в том, как превратить пример в сервер CherryPy. Ответ, который я дал, верен, вы не можете, кроме того факта, что gevent-socketio требует стека gevent, вы просто не можете, потому что CherryPy все равно не реализует протокол socket.io. Вздох. - person Sylvain Hellegouarch; 09.08.2012