2011-07-14 27 views
19

私は、カスタムイベントをサーバーに送信して、Socket.io 0.7を使用してNode.jsサーバーと通信するPythonクライアントを取得しようとしています。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

私はbarebones socket.io client libraryrodの研究を包みました。

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

関連する問題