首先,让我对Stack Overflow社区表示感谢 - 尽管我之前没有发布过,但我在过去找到了无数解决方案。我非常感谢社区投入的时间和精力,使其成为每个人的优秀资源。
我正在尝试从使用Socket.IO和XHR轮询数据的服务器获取数据。虽然我似乎可以连接Python脚本,但我无法正确接收数据。
我查看了Fiddler中的传出和传入数据包:每隔约5秒,浏览器会收到有用的信息(即'5 ::: {“name”:“pollData”,“args”:[“< ..'),但Python脚本接收NOOP响应('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
我尝试过使用Websocket客户端,但它产生了这个错误:WebSocketException:Handshake Status 200
SocketIO-client产生此错误:SocketIOError:无法建立连接
比使用另一个库来解决这个问题更重要的是,我想了解为什么会这样。由脚本和Chrome生成的传出数据包看起来,至少对于一个外行人来说,基本相同 - 为什么他们会产生这样不同的结果?
(欢迎提出任何问题或要求提供更多信息。)
答案 0 :(得分:0)
为了防止将来有人受益,经过多次试验和错误,我意识到它需要再发一次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被破坏了,Socket.IO不得不在XHR轮询上回退。此外,可能有更简单的方法来做到这一点。]