通过自定义socket.io事件将Python客户端连接到Socket.io

我有一个socket.io服务器(在node.js中),我试图连接一个Python客户端,主要是为我的套接字服务器提供一个命令行界面。

我正在使用Python的Web套接字,但是,我意识到这只支持四个“事件”:打开,closures,错误和消息。

我的socket.io服务器定义了诸如.on('connection')类的自定义事件。 我怎么能发射/接收这样的自定义事件在Python中?

这是我的脚本到目前为止,只是启动和closures,所以它不起作用。 导入networking套接字,请求,线程,时间主机=' 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) 

我遇到了同样的问题,并自行解决了这个问题。 在这里我写了一些关于使用库socketIO_client的意见,并希望它有帮助。

开发环境:服务器/客户端:由python编写的nodejs / sio_client

  1. “没有处理程序可以findlogging”socketIO_client“,这意味着它需要处理日志的东西。 logging.basicConfig(level = logging.DEBUG) “并logging。
  2. “socketio_client永远挂起”,因为它不停地重新连接到指定的服务器,也就是说,直到socketIO对象被初始化并返回, 命名空间对象才会被采用。 我有其他线程(称为thr_siohandle),它初始化socketio对象和主线程使用包含在命名空间中的队列,以检查是否有来自服务器的响应。 看来你的服务器应该在运行你的sio_client之前一直可以访问,否则它会保持重新连接,除非你停止了这个程序。 虽然可以将wait_for_connection设置为True来停止它,但您必须自己处理socketIO_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 。 在select这个库之前,请提醒检查你的软件包版本。 希望它能帮助像我这样的同样的问题。