问题描述
我在 Python 应用程序中使用 Flask
和 Flask-SocketIO
。
最近,当我启动应用程序时,我收到以下消息:
The client is using an unsupported version of the Socket.IO or Engine.IO protocols (further occurrences of this error will be logged with level INFO)
通过我的搜索,我在 Flask-SocketIO
s 的文档中找到了 this table,这表明我的系统存在版本不兼容问题。
我想知道我拥有哪个版本的 JavaScript Socket.IO。如何做到这一点?
系统详情
如果不是很明显,我是 JavaScript 新手。
- 操作系统:macOS 版本 10.15.7
- JavaScript 版本:1.7
- 浏览器:Google Chrome 版本 87.0.4280.88
- Python 版本:3.8.6
- 来自 Python 虚拟环境的包:
Flask 1.1.2
Flask-SocketIO 5.0.1
python-engineio 4.0.0
python-socketio 5.0.4
解决方法
冲突可能是由于在客户端和服务器上使用了不同的协议修订版。
该协议定义了客户端和服务器之间交换的数据包的格式。客户端和服务器都必须使用相同的修订版才能相互理解。
要确定客户端的修订号,
来自 HTML:
<script src="<your-path-to>socket.io.js"></script>
<script>
const socket = io('http://localhost');
const revisionNumber = socket.protocol;
</script>
或者来自 JavaScript:
const io = require('socket.io-client');
// or with import syntax
import { io } from 'socket.io-client';
const revisionNumber = io.protocol;
或者来自 Flask-SocketIO 源代码:
- 在文件
__version__
中搜索__init__.py
。该行将如下所示:
__version__ = '5.0.2dev'
- 使用该
__version__
值,查找相应的 Socket.IO 协议修订版:
+--------------+----------------+
| __version__ | protocol rev. |
+--------------+----------------+
| 4.x.x | 3,4 |
+--------------+----------------+
| 5.x.x | 5 |
+--------------+----------------+
,
我找到了解决办法。 这是我的 index.html 文件头部的样子:
public void run() {
CommandLine cmd = new CommandLine(new App());
cmd.usage(System.out,Ansi.ON);
// business logic here...
}
我从 youtube 上的一些教程中找到了这个脚本。我正在 Pycharm 上编程,当我左键单击此行中的链接时:
<title>Chat Room</title>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.8/socket.io.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
</head>
它打开了一个弹出窗口,询问我是否要安装该软件包。
希望这对你有用 要查看代码的 javaScript 部分,您可以查看我的问题: How do i properly install flask-socketIO?
,好的,多亏前两个回答这个问题,我终于知道如何识别JavaScript Socket.IO的版本了。
我无法更快弄清楚的根本原因是:
- 我继承了这个代码库,所以我并没有真正把它导入到哪里
- 我真的不知道
Flask
JavaScript Socket.IO 的版本在模板目录中的 layout.html
中调用(参见 Flask
docs here)。在 <head>
元素中,嵌入了 socket.io.js
脚本:
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js"></script>
它明确指出 JavaScript Socket.IO 的版本为 2.0.4。
因此,根据 Flask-SocketIO
的 version compatibility table 和 this comment on a Flask-SocketIO
issue,我现在只需将 Flask-SocketIO
固定在我的包裹要求中,如下所示:Flask-SocketIO>=4.3.2,<5
。>
因为这个答案是针对我的用例,而不是通用的,所以我不会接受这个答案。
,可以看下图了解版本兼容性:
最近我在我的 mac 上尝试并测试了以下版本,它们彼此完全兼容:
后端:
python-engineio==4.1.0
python-socketio==5.2.1
Flask==1.1.2
Flask-SocketIO==5.0.1
前端:
socket.io-client="^3.0.0"