格式化消息以从 python 客户端发送到 socket.io node.js 服务器

Posted

技术标签:

【中文标题】格式化消息以从 python 客户端发送到 socket.io node.js 服务器【英文标题】:Formatting messages to send to socket.io node.js server from python client 【发布时间】:2011-10-05 07:03:59 【问题描述】:

我正在尝试通过向服务器发送自定义事件来让 Python 客户端与使用 Socket.io 0.7 的 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

我在这里可能做错了什么?

【问题讨论】:

已解决。只要我被允许这样做,我就会接受我自己的答案。问题在于对 JSON 使用单引号而不是双引号。 【参考方案1】:

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

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

变成:

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

【讨论】:

【参考方案2】:

我将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)

【讨论】:

socketIO.wait 是做什么的? seconds=1 是超时吗?

以上是关于格式化消息以从 python 客户端发送到 socket.io node.js 服务器的主要内容,如果未能解决你的问题,请参考以下文章

SSL客户端程序在发送后关闭(python)

将协议缓冲区编码的消息从 Python 服务器发送到 Java 客户端

你如何将消息从 Flask 服务器(Python)发送到 HTML 客户端?

Python websocket 客户端 - 从 python 代码向 WebSocketServer 发送消息

如何获取 PHP 脚本以从已运行的进程发送和接收数据?

执行 python 程序以从 twilio 服务器获取呼叫者参加电话会议时出错