2011-07-14 123 views
19

我想通过向服务器发送自定义事件来获取Python客户端与使用Socket.io 0.7的Node.js服务器通信。格式化从python客户端发送到socket.io node.js服务器的消息

基于我在GitHub和以下的WebSocket Python library上找到的Socket.io引用。

这里是我到目前为止的代码:

节点服务器

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来触发事件。

我没想到框架是必要的,但是Archie1986似乎不同意他对此的回应:Socket.IO Client Library in Python

什么可能我做错了吗?

+1

已解决。只要我被允许,我会尽快接受我自己的答案。问题在于对JSON使用单引号而不是双引号。 – rod

回答

14

已解决。我需要使用双引号。单引号不是有效的JSON。 Woops。

ws.send("5:1::{'name':'newimg', 'args':'bla'}") 

变为:

ws.send('5:1::{"name":"newimg", "args":"bla"}') 
20

我包rod的研成barebones socket.io client library

pip install -U socketIO-client 
python 
    from socketIO_client import SocketIO 
    with SocketIO('localhost', 8000) as socketIO: 
     socketIO.emit('aaa') 
     socketIO.wait(seconds=1) 
+0

socketIO.wait有什么作用? 是秒= 1超时? – lmc

相关问题