我会在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()
我的问题是如何连接到特定的命名空间?
由于
答案 0 :(得分:2)
您可以使用MIT许可下的PyPI上提供的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()
答案 1 :(得分: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')
中解决了这个问题
希望你节省很多时间
答案 2 :(得分: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
在您将在文档中看到的不同类型的数据包中指定了特定的命名空间。
希望这有帮助。