flask-SocketIO 客户端使用原生 WebSocket 不能成功连接,但使用 socket.io 却能正常连接?

2018-07-05 18:43:34 +08:00
 Akikiki

Python 2.7 使用 flask_socketio(3.0.1) 时,浏览器控制台下用原生

var socket = new WebSocket("ws://127.0.0.1:5000/char")

错误信息如下:

VM167:1 WebSocket connection to 'ws://127.0.0.1:5000/chat' failed: Error during WebSocket handshake: Unexpected response code: 200

引入 socket.io

socket = io.connect('ws://127.0.0.1:5000/chat')

查看 socket 的 connected 属性显示为 true

flask_socketio 的 git 地址: https://github.com/miguelgrinberg/Flask-SocketIO

是不是只能使用 socket.io 创建 client 进行连接?给的 demo 也都是使用 socket.io

求踩过坑的朋友指点一下,谢谢!

8429 次点击
所在节点    Python
31 条回复
hand515
2018-07-05 18:45:16 +08:00
socket.io 用了 polling 模式吗?
Akikiki
2018-07-05 18:47:16 +08:00
@hand515 你是说客户端吗?应该没有。我只是测试了下能不能连接成功。
xiaoshenke
2018-07-05 18:47:44 +08:00
是的,只能用 socket.io 的 client。我这边本来有个 python ws 的需求,现在就是一直往后延。。。python 做 web 可能确实不是特别合适吧。。
Akikiki
2018-07-05 18:49:12 +08:00
@xiaoshenke 这就有点蛋疼了。。。 好像 tornado 没有这个问题。
Akikiki
2018-07-05 19:08:00 +08:00
golmic
2018-07-05 19:08:06 +08:00
@Akikiki 我用 Python Flask socketio 正常。Python 版本 3.7.0
hcymk2
2018-07-05 19:14:37 +08:00
F12 看下 network 里面 ws 有没有包。
Akikiki
2018-07-05 19:18:03 +08:00
@golmic client 用的是 socket.io 吗?
golmic
2018-07-05 19:19:46 +08:00
@Akikiki
Akikiki
2018-07-05 19:20:42 +08:00
@hcymk2 用 new 出来的 WebSocket 去连接会看到 WS 里面有包,但是用 socket.io 看不到。
Akikiki
2018-07-05 19:21:04 +08:00
@golmic 好吧,我用 socket.io 也是没有问题的。
xiaoxinxiaobai
2018-07-05 19:22:58 +08:00
地址对了吗,flask socketio 就是那个作者写的 socketio 的 Py 版本,但是客户端应该不影响,只要是个 ws
Akikiki
2018-07-05 19:25:56 +08:00
@xiaoxinxiaobai 两种连接方式使用的是同一个地址。我看到官方文档写了 *The client-side application can use any of the SocketIO official clients libraries in Javascript, C++, Java and Swift, or any compatible client to establish a permanent connection to the server.*,这算是声明了吗?
wheato
2018-07-05 19:31:46 +08:00
看看是不是 python 少了一个依赖,貌似叫 gevent ?如果 websoket 建立不了链接,socket.io 会自动退化到 polling 模式。
xiaoxinxiaobai
2018-07-05 19:35:00 +08:00
@Akikiki 咦,那有可能是,实现的不是单纯的 websocket 协议
Trim21
2018-07-05 19:37:46 +08:00
socket io 服务器和客户端虽然可以通过 websocket 连接 但是不能用浏览器原生的 websocket 连接 socket io 服务器 socket io 有自己自定义的一套协议。
ahjsrhj
2018-07-05 19:39:26 +08:00
问一个问题:使用 socket.io 做服务端能直接用 websocket 当做客户端链接么?
Akikiki
2018-07-05 19:41:33 +08:00
@wheato 这个是装了的,因为没装的时候会有 Warning。但是我用 flask_socketio 作者自己的 demo 跑,显示的链接也是 /socket.io/?EIO=3&transport=polling&t=1530787155994-0 这种
baelish
2018-07-05 19:44:47 +08:00
/char or /chat?
Akikiki
2018-07-05 19:51:17 +08:00
@baelish 谢谢提醒,刚去我测试代码看了下,代码里没有错。帖子里写错了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/468451

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX