Python Socketio 未与 JavaScript socket.io-客户端连接
Python Socketio not connecting with JavaScript socket.io-client
我想简单地将 socket.io-client 连接到 python 服务器,但由于某种原因它一直失败。最初我启动我的 python 服务器,然后尝试连接 JavaScript 作为我的客户端服务器,然后我看到的是 JavaScript 客户端服务器不断尝试连接并失败并出现以下错误:
websocket.js:88 WebSocket connection to 'ws://localhost:5100/socket.io/?EIO=4&transport=websocket' failed:
和 python 服务器也重复以下错误:
(10448) accepted ('127.0.0.1', 61471)
127.0.0.1 - - [01/Feb/2022 15:14:01] "GET /socket.io/?EIO=4&transport=websocket HTTP/1.1" 400 136 0.000000
我正在使用 python3.10 和 socketio,遵循文档:
https://python-socketio.readthedocs.io/en/latest/.
还尝试了版本兼容性:
https://pypi.org/project/python-socketio/
pip3 冻结
我尝试了 python-engineio 和 python-socketio 的多个版本来匹配我的 socket.io-client
但没有改善。
eventlet==0.33.0
python-engineio==3.13.0
python-socketio==4.6.1
server.py
import eventlet
import socketio
sio = socketio.Server()
app = socketio.WSGIApp(sio)
@sio.event
def connect(sid, environ):
print('[INFO] Connect to client', sid)
@sio.event
def disconnect(sid):
print('disconnect ', sid)
#ESI.local 192.168.2.95
if __name__ == '__main__':
eventlet.wsgi.server(eventlet.listen(('0.0.0.0', 5100)), app)
HTML/JavaScript
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Socket IO Demo</h1>
<script type="module">
import { io } from "https://cdn.socket.io/4.3.2/socket.io.esm.min.js";
const sio = io("http://localhost:5100:", {
forceJSONP: true,
secure: true,
jsonp: true,
transports: [ "websocket","polling"]
});
sio.on("connect", () => {
console.log("connected");
});
sio.on("disconnect", () => {
console.log("Disconnected");
});
</script>
</body>
</html>
如果你想执行 websocket,我会推荐使用 WebSocket 包 built-in 和 gevent 的 websocket。
这是我为实现与您想要做的类似的事情所做的工作:
let socket = new WebSocket('ws://localhost:8080');
console.log('Created socket');
// Connection opened
socket.addEventListener('open', function (event) {
socket.send('Hello Server!');
});
// Listen for messages
socket.addEventListener('message', function (event) {
console.log('Message from server ', event.data);
});
// For example : send array
socket.send(JSON.stringify([1, 2, 3]));
Python 服务器:
from geventwebsocket import WebSocketServer, WebSocketApplication, Resource
from collections import OrderedDict
class Application(WebSocketApplication):
def on_open(self):
print("Connection opened")
def on_message(self, message):
print("Got message: ", message)
# self.ws.send(...) to make a response
def on_close(self, reason):
print(reason)
WebSocketServer(
('localhost', 8080),
Resource(OrderedDict([('/', Application)]))
).serve_forever()
Gevent (python) : https://pypi.org/project/gevent-websocket/
经过多次试验和错误。我终于破解了它。这是由于 CORS 而发生的,尽管我使用 CORS google 扩展来处理这种情况,但我想这应该在后端处理。只需将 (cors_allowed_origins="*") 传递给 socketio.Server() 即可解决所有问题。
sio = socketio.Server(cors_allowed_origins="*")
我想简单地将 socket.io-client 连接到 python 服务器,但由于某种原因它一直失败。最初我启动我的 python 服务器,然后尝试连接 JavaScript 作为我的客户端服务器,然后我看到的是 JavaScript 客户端服务器不断尝试连接并失败并出现以下错误:
websocket.js:88 WebSocket connection to 'ws://localhost:5100/socket.io/?EIO=4&transport=websocket' failed:
和 python 服务器也重复以下错误:
(10448) accepted ('127.0.0.1', 61471) 127.0.0.1 - - [01/Feb/2022 15:14:01] "GET /socket.io/?EIO=4&transport=websocket HTTP/1.1" 400 136 0.000000
我正在使用 python3.10 和 socketio,遵循文档:
https://python-socketio.readthedocs.io/en/latest/.
还尝试了版本兼容性:
https://pypi.org/project/python-socketio/
pip3 冻结
我尝试了 python-engineio 和 python-socketio 的多个版本来匹配我的 socket.io-client 但没有改善。
eventlet==0.33.0
python-engineio==3.13.0
python-socketio==4.6.1
server.py
import eventlet
import socketio
sio = socketio.Server()
app = socketio.WSGIApp(sio)
@sio.event
def connect(sid, environ):
print('[INFO] Connect to client', sid)
@sio.event
def disconnect(sid):
print('disconnect ', sid)
#ESI.local 192.168.2.95
if __name__ == '__main__':
eventlet.wsgi.server(eventlet.listen(('0.0.0.0', 5100)), app)
HTML/JavaScript
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Socket IO Demo</h1>
<script type="module">
import { io } from "https://cdn.socket.io/4.3.2/socket.io.esm.min.js";
const sio = io("http://localhost:5100:", {
forceJSONP: true,
secure: true,
jsonp: true,
transports: [ "websocket","polling"]
});
sio.on("connect", () => {
console.log("connected");
});
sio.on("disconnect", () => {
console.log("Disconnected");
});
</script>
</body>
</html>
如果你想执行 websocket,我会推荐使用 WebSocket 包 built-in 和 gevent 的 websocket。
这是我为实现与您想要做的类似的事情所做的工作:
let socket = new WebSocket('ws://localhost:8080');
console.log('Created socket');
// Connection opened
socket.addEventListener('open', function (event) {
socket.send('Hello Server!');
});
// Listen for messages
socket.addEventListener('message', function (event) {
console.log('Message from server ', event.data);
});
// For example : send array
socket.send(JSON.stringify([1, 2, 3]));
Python 服务器:
from geventwebsocket import WebSocketServer, WebSocketApplication, Resource
from collections import OrderedDict
class Application(WebSocketApplication):
def on_open(self):
print("Connection opened")
def on_message(self, message):
print("Got message: ", message)
# self.ws.send(...) to make a response
def on_close(self, reason):
print(reason)
WebSocketServer(
('localhost', 8080),
Resource(OrderedDict([('/', Application)]))
).serve_forever()
Gevent (python) : https://pypi.org/project/gevent-websocket/
经过多次试验和错误。我终于破解了它。这是由于 CORS 而发生的,尽管我使用 CORS google 扩展来处理这种情况,但我想这应该在后端处理。只需将 (cors_allowed_origins="*") 传递给 socketio.Server() 即可解决所有问题。
sio = socketio.Server(cors_allowed_origins="*")