为了更好地理解 websockets 在基本的 hello-world 之外是如何使用的,我给自己设定了使用 websockets 和 JSON 从页面获取一些数据的任务(因为 gitxiv 的源代码很容易获得,所以我选择查看http: //gitxiv.com/day/2015/12/31)。
通过 Python 连接到这个 websocket 似乎很简单
from websocket import create_connection
import websocket
import pprint
websocket.enableTrace(True)
ws=create_connection("ws://gitxiv.com/sockjs/212/2aczpiim/websocket")
result = ws.recv()
print "Received '%s'" % result
result = ws.recv()
print "Received '%s'" % result
我对 ws:// url 中的变量并不完全清楚,例如“212”。运行这段代码似乎可以可靠地连接(尽管总是有可能没有正确的变量导致服务器稍后拒绝合作?)
现在,如果我观察 Firefox 和 gitxiv 页面之间的通信,我会看到服务器发送的以下 websocket 连接
o
a["{\"server_id\":\"0\"}"]
上面的脚本得到了相同的响应,所以看起来连接成功了。
然而,这是我绊倒的地方。通信的下一步是我的浏览器向 Web 服务发送了相当多的信息,例如以下行:
"["{\"msg\":\"connect\",\"version\":\"1\",\"support\":[\"1\",\"pre2\",\"pre1\"]}"]"
使用 ws.send() 直接发送这些行会导致“断帧”。只发送:
controlstr='{"msg":"connect","version":"1","support":["1","pre2","pre1"]}';
ws.send(controlstr)
导致发送的内容如下所示:
send: '\x81\xbd\xef\x17F8\x945+K\x885|\x1a\x8cx(V\x8at2\x1a\xc350]\x9dd/W\x815|\x1a\xde5j\x1a\x9cb6H\x80e2\x1a\xd5Ld\t\xcd;dH\x9drt\x1a\xc356J\x8a&de\x92'
我得到一个不同的错误:
'a["{\\"msg\\":\\"error\\",\\"reason\\":\\"Bad request\\"}"]'
因此,我将此 JSON 消息发送到 websocket 的方式似乎有问题。有谁知道它期望什么格式,以及如何使用 websocket/websocket-client 来实现它?任何澄清/建议都将受到欢迎。
我希望发送的 JSON 消息是 Firefox 的 Websocket 开发人员工具报告的消息:这是一个屏幕截图: