为了更好地理解Websockets如何在基本的hello-world之外使用,我设定了一个任务:使用Websockets和JSON从页面获取一些数据(因为gitxiv的源代码是可用的,我选择查看http://gitxiv.com/day/2015/12/31)。
通过Python连接到这个Websocket似乎很简单。
我不是很清楚ws:// URL中的变量,比如“212”。运行此代码似乎可靠地建立连接(尽管有可能因未正确设置变量而导致服务器拒绝合作)。现在,如果我观察Firefox和gitxiv页面之间的通信,我会看到在WebSocket连接之后,服务器发送了以下内容。
使用ws.send()直接发送这些行会导致“破碎的帧”。仅发送以下内容:
因此,似乎我向websocket发送JSON消息的方式有问题。是否有人知道它期望的格式以及如何使用websocket/websocket-client实现它?欢迎任何澄清/建议。
我要发送的JSON消息是Firefox的Websocket开发工具报告的那些:这里是一个截图:
通过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\\"}"]'
因此,似乎我向websocket发送JSON消息的方式有问题。是否有人知道它期望的格式以及如何使用websocket/websocket-client实现它?欢迎任何澄清/建议。
我要发送的JSON消息是Firefox的Websocket开发工具报告的那些:这里是一个截图: