Python-WebSocket和Socket.IO命名空间

3
我将用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()

我的问题是如何连接到特定的命名空间? 谢谢。
3个回答

2
您可以使用在PyPI上以MIT许可证提供的socketIO-client。它支持单个套接字的不同命名空间。
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()

对于那些正在使用它的人,我相信格式最近有些改变。如果你遇到困难,请阅读文档。 https://pypi.python.org/pypi/socketIO-client - simonmorley

1
您可以更轻松地更改命名空间。
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中解决了这个问题。

希望能节省你的时间。


0
我建议您使用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

在文档中,不同类型的数据包中都指定了特定的命名空间。

希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接