我试图通过向服务器发送自定义事件来使Python客户端使用Socket.io 0.7与Node.js服务器通信。
基于我在GitHub上找到的Socket.io参考以及以下WebSocket Python库。
到目前为止,这是我的代码:
节点服务器
io.sockets.on('connection', function (socket) { socket.on('newimg', function(data) { console.log(data); }); });
Python客户端
def handshake(host, port): u = urlopen("http://%s:%d/socket.io/1/" % (host, port)) if u.getcode() == 200: response = u.readline() (sid, hbtimeout, ctimeout, supported) = response.split(":") supportedlist = supported.split(",") if "websocket" in supportedlist: return (sid, hbtimeout, ctimeout) else: raise TransportException() else: raise InvalidResponseException() try: (sid, hbtimeout, ctimeout) = handshake(HOSTNAME, PORT) #handshaking according to socket.io spec. Except Exception as e: print e sys.exit(1) ws = websocket.create_connection("ws://%s:%d/socket.io/1/websocket/%s" % (HOSTNAME, PORT, sid)) print ws.recv() ws.send("2::") ws.send("5:1::{'name':'newimg', 'args':'bla'}") print ws.recv() print "Closing connection" ws.close()
节点控制台输出
debug - client authorized info - handshake authorized 12738935571241622933 debug - setting request GET /socket.io/1/websocket/12738935571241622933 debug - set heartbeat interval for client 12738935571241622933 debug - client authorized for debug - websocket writing 1:: debug - websocket received data packet 2:: debug - got heartbeat packet debug - websocket received data packet 5:1::{'name':'newimg', 'args':'bla'} debug - acknowledging packet automatically debug - websocket writing 6:::1 info - transport end debug - set close timeout for client 12738935571241622933 debug - cleared close timeout for client 12738935571241622933 debug - cleared heartbeat interval for client 12738935571241622933 debug - discarding transport
Python控制台输出
Done 1:: 6:::1 Closing connection
现在看来,尽管服务器以ACK响应,套接字事件仍未触发。因此,该消息已正确接收,但我认为,socket.io触发事件的格式不正确。
我在这里可能做错了什么?
解决。我需要使用双引号。单引号不是有效的JSON。哎呀
ws.send("5:1::{'name':'newimg', 'args':'bla'}")
成为:
ws.send('5:1::{"name":"newimg", "args":"bla"}')