使用flask实现WebSocket
游览器端HTML代码
socket.on('message', (message) => {
const messagesList = document.getElementById('messagesList');
const messageItem = document.createElement('li');
messageItem.textContent = `前端Received: ${message}`;
messagesList.appendChild(messageItem);
});
function sendMessage() {
const messageInput = document.getElementById('messageInput');
const message = messageInput.value;
socket.send(message);
const messagesList = document.getElementById('messagesList');
const messageItem = document.createElement('li');
messageItem.textContent = `前端Sent: ${message}`;
messagesList.appendChild(messageItem);
messageInput.value = '';
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WebSocket Client</title>
<script src="https://cdn.socket.io/4.0.0/socket.io.min.js"></script>
</head>
<body>
<h1>WebSocket Client</h1>
<input id="messageInput" type="text" placeholder="Type a message">
<button onclick="sendMessage()">Send</button>
<ul id="messagesList"></ul>
<script>
const socket = io('http://localhost:5000');
socket.on('connect', () => {
console.log('Connected to WebSocket server');
});
socket.on('message', (message) => {
const messagesList = document.getElementById('messagesList');
const messageItem = document.createElement('li');
messageItem.textContent = `前端Received: ${message}`;
messagesList.appendChild(messageItem);
});
socket.on('disconnect', () => {
console.log('Disconnected from WebSocket server');
});
function sendMessage() {
const messageInput = document.getElementById('messageInput');
const message = messageInput.value;
socket.send(message);
const messagesList = document.getElementById('messagesList');
const messageItem = document.createElement('li');
messageItem.textContent = `前端Sent: ${message}`;
messagesList.appendChild(messageItem);
messageInput.value = '';
}
</script>
</body>
</html>
服务器端代码
@socketio.on('message')
def handle_message(message):
print(f"Received message: {message}")
send(f"后端已接收: {message}", broadcast=True)
@app.route('/send_message', methods=['POST'])
def send_message():
data = request.get_json()
if not data or 'message' not in data:
return jsonify({"error": "Invalid request, missing 'message'"}), 400
message = data['message']
socketio.emit('message', message)
return jsonify({"status": "message sent"}), 200
from flask import Flask, request, jsonify
from flask_socketio import SocketIO, send, emit
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app, cors_allowed_origins="*")
connected_clients = []
@app.route('/send_message', methods=['POST'])
def send_message():
data = request.get_json()
if not data or 'message' not in data:
return jsonify({"error": "Invalid request, missing 'message'"}), 400
message = data['message']
socketio.emit('message', message)
return jsonify({"status": "message sent"}), 200
@socketio.on('connect')
def handle_connect():
print('Client connected')
connected_clients.append(request.sid)
@socketio.on('disconnect')
def handle_disconnect():
print('Client disconnected')
connected_clients.remove(request.sid)
@socketio.on('message')
def handle_message(message):
print(f"Received message: {message}")
send(f"后端已接收: {message}", broadcast=True)
if __name__ == '__main__':
socketio.run(app, host='localhost', port=5000)
- 测试代码:实现在使用其他模块时调用websocket向游览器发送消息
import requests
import json
if __name__ == '__main__':
url = 'http://localhost:5000/send_message'
message = {'message': '后端信息hello'}
json_message = json.dumps(message)
response = requests.post(url, json=message)
运行截图
- 运行后端和前端,并在文本框中输入:前端信息hello
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ac3752e862f044aab411c2b3425d212a.png#pic_center)
- 测试其他模块调用使用
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4a2537bcb36d41c4825d2943eb79b1fb.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/499cc76b71e8428bad93adf62397e099.png#pic_center)