首先,请允许我对Stack Overflow社区表示感谢——虽然我以前没有发表过文章,但我在过去已经为我的问题找到了无数的解决方案。我非常感谢社区投入的时间和精力,使它成为每个人的优秀资源。
我试图从使用套接字的服务器获取数据。IO与xhr轮询数据结合使用。虽然我似乎可以连接到Python脚本,但我不能正确接收数据。
我已经查看了Fiddler中的传出和传入数据包:每~5秒,浏览器接收到有用的信息(即:5:::{"名称":"pollData","参数":[" & lt;…"),但Python脚本接收等待响应(' 8::')。
有问题的部分代码:
reply = requests.get(URL + "/socket.io/1/?t=" + str(long(time.time()*1000)), headers=headers)
session_id = reply.text.split(':')[0]
print "Session ID:", session_id
reply = requests.post(URL + "/socket.io/1/xhr-polling/" + session_id + "?t=" +
str(long(time.time()*1000)), data=message, headers=headers)
print "Successfully subscribed."
for i in range(5):
sleep(5)
reply = requests.get(URL + "/socket.io/1/xhr-polling/" + session_id + "?t=" +
str(long(time.time()*1000)), headers=headers)
print reply.text
我尝试使用websocketclient,但是它产生了这个错误:WebSocketException: Handshake Status 200
SocketIOError: Could not establish connection
比起使用另一个库来解决这个问题更重要的是,我想了解为什么会发生这种情况。至少在外行人看来,脚本和Chrome输出的数据包基本上是一样的——为什么它们产生的结果如此不同?
(欢迎提问或索取更多信息)
为了防止将来有人从中受益,经过多次尝试和错误之后,我意识到在发布订阅信息之前还需要一个GET请求。下面的一些代码可能是多余的,但似乎可以工作:
reply = requests.get(url + "?t=" + get_timecode(), stream=True)
session_id = reply.text.split(':')[0]
main = requests.Session()
print "Session ID:", session_id
reply = main.get(url + "xhr-polling/" + session_id + "?t=" + get_timecode(),
stream=True)
reply = main.post(url + "xhr-polling/" + session_id + "?t=" + get_timecode(),
data=subscribe, stream=True)
print "Successfully subscribed."
while 1:
reply = main.get(url + "xhr-polling/" + session_id + "?t=" + get_timecode(),
stream=True)
[注意,这是必要的,因为服务器的websocket被破坏了。IO不得不求助于xhr轮询。而且,可能有更简单的方法来做到这一点[/p>