0

首先,让我对 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 生成的传出数据包看起来,至少在外行看来,基本相同——为什么它们会产生如此不同的结果?

(欢迎提出任何问题或索取更多信息。)

4

1 回答 1

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 轮询。此外,可能还有更简单的方法可以做到这一点。]

于 2013-05-28T00:00:40.027 回答