python-websocket 和 socket.io 命名空间



我会用python编写一个websocket客户端来连接到用 socket.io 编写的服务器。我当前的代码取自 1 如下:

import websocket, httplib, sys, asyncore
def connect(server, port):
    print("connecting to: %s:%d" %(server, port))
    conn  = httplib.HTTPConnection(server + ":" + str(port))
    conn.request('POST','/socket.io/1/')
    resp  = conn.getresponse() 
    hskey = resp.read().split(':')[0]
    ws = websocket.WebSocket(
                'ws://'+server+':'+str(port)+'/socket.io/1/websocket/'+hskey,
                onopen   = _onopen,
                onmessage = _onmessage,
                onclose = _onclose)
    return ws
def _onopen():
    print("opened!")
def _onmessage(msg):
    print("msg: " + str(msg))
def _onclose():
    print("closed!")

if __name__ == '__main__':
    server = 'localhost'
    port = 8081
    ws = connect(server, port)
    try:
        asyncore.loop()
    except KeyboardInterrupt:
        ws.close()

我的问题是如何连接到特定的命名空间?

谢谢

您可以使用 socketIO-client,它在 MIT 许可证下的 PyPI 上可用。 它支持单个套接字的不同命名空间。

from socketIO_client import SocketIO, BaseNamespace
class MainNamespace(BaseNamespace):
    def on_aaa(self, *args):
        print 'aaa', args
class ChatNamespace(BaseNamespace):
    def on_bbb(self, *args):
        print 'bbb', args
class NewsNamespace(BaseNamespace):
    def on_ccc(self, *args):
        print 'ccc', args
mainSocket = SocketIO('localhost', 8000, MainNamespace)
chatSocket = mainSocket.connect('/chat', ChatNamespace)
newsSocket = mainSocket.connect('/news', NewsNamespace)
mainSocket.wait()

您可以更轻松地更改命名空间。

from socketIO_client import SocketIO, BaseNamespace
socket = SocketIO('192.168.4.47', 7777)
chat = socket.define(BaseNamespace, '/openchat')
chat.emit('echo', 'hello openchat my name is Anderson')

我已经在 https://pypi.python.org/pypi/socketIO-client 解决了这个问题

希望你能节省很多时间

我建议你使用Wireshark来嗅探与 Socket.IO 建立的连接,并通过websocket连接发送正确的数据包,假装是 Socket.IO 客户端......然后实现 Socket.IO 层的数据包和消息传递协议。

这里有数据包类型的基本文档:

http://gevent-socketio.readthedocs.org/en/latest/packet.html#module-socketio.packet

此外,您还可以阅读显示线级协议(您可能需要实现)的测试套件:

https://github.com/abourget/gevent-socketio/blob/master/tests/test_packet.py

特定

命名空间在不同类型的数据包中指定,如您将在文档中看到的那样。

希望这有帮助。

相关内容

  • 没有找到相关文章

最新更新