用python实现上面所说的实例
时间: 2025-03-10 15:00:37 浏览: 17
要用Python实现一个类似于上面提到的聊天室系统的示例,可以采用 `Flask` 框架结合 `Flask-SocketIO` 库来处理 WebSocket 连接。这个组合非常适用于构建轻量级、高效的实时应用程序,并且容易与其他数据库服务如MongoDB一起工作。
下面是该架构的具体实现步骤:
### 环境准备
首先确保安装了必要的依赖包:
```bash
pip install flask flask_socketio pymongo redis eventlet
```
### 创建 Flask 应用程序
#### app.py 文件内容如下:
```python
from flask import Flask, render_template_string, request
from flask_socketio import SocketIO, emit
import os
from pymongo import MongoClient
import datetime as dt
import json
app = Flask(__name__)
socketio = SocketIO(app, cors_allowed_origins="*")
# MongoDB setup
client = MongoClient('mongodb://localhost:27017/')
db = client['chat_app']
collection = db['messages']
# Redis pub/sub setup for message distribution between multiple servers if needed.
redis_client = None # Initialize your Redis connection here.
@app.route('/')
def index():
return render_template_string(open("index.html").read())
@socketio.on('connect')
def handle_connect():
print(f"Client connected from IP {request.remote_addr}")
@socketio.on('disconnect')
def test_disconnect():
print(f"Client disconnected from IP {request.remote_addr}")
@socketio.on('send_message')
def handle_send(data):
username = data.get('username', 'Guest')
content = data.get('content')
now = dt.datetime.now()
msg_doc = {"username": username,
"message": content,
"timestamp": now}
collection.insert_one(msg_doc)
saved_msg = collection.find_one({"_id":msg_doc["_id"]})
formatted_msg = {
"id": str(saved_msg["_id"]),
"username": saved_msg["username"],
"message": saved_msg["message"],
"time": saved_msg["timestamp"].strftime('%Y-%m-%d %H:%M:%S'),
}
# Broadcast the new message to all clients except sender
socketio.emit('receive_message', formatted_msg, broadcast=True, include_self=False)
if __name__ == '__main__':
socketio.run(app, debug=True)
```
### HTML模板文件 (`templates/index.html`)
创建静态HTML页面用于显示聊天界面,简化版代码片段如下所示:
```html
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>简易聊天室</title>
</head>
<body>
<div id="chat-container"></div>
<script src="/static/socket.io.js"></script>
<script type="text/javascript">
const sockerIoConnectionUrl = window.location.protocol + "//" +
window.location.host;
var chatSocket = io(sockerIoConnectionUrl);
function appendMessage(messageObj){
const containerEl = document.getElementById('chat-container');
let elMsg = `<p><strong>${messageObj.username}</strong>: ${messageObj.message} (${messageObj.time})</p>`;
containerEl.innerHTML += elMsg;
};
// Listen for messages received through websocket and update DOM accordingly
chatSocket.on('receive_message', function (data) {
console.log(`Received a message: `, data);
appendMessage(data);
});
document.addEventListener("DOMContentLoaded", () => {
// Add an event listener when form is submitted by user inputting text into textarea field
document.querySelector("#input-form").addEventListener("submit", evt => {
evt.preventDefault();
var formData = Object.fromEntries(new FormData(evt.target));
chatSocket.emit('send_message', {'username':formData.name,'content':formData.text});
// Clear out previous inputs after submission
document.querySelectorAll('[name=name],[name=text]').forEach(input=>{input.value=''});
});
}, false);
</script>
<form action="#" method="post" enctype="application/x-www-form-urlencoded" id="input-form">
名字:<br/>
<input name="name"/><br/><br/>
内容:<br/>
<textarea rows=5 cols=40 maxlength=300 required name="text"></textarea><br/>
<button type="submit">发送</button>
</form>
</body>
</html>
```
请注意以上只是一个简化的演示版本,在生产环境中还需要进一步完善错误处理机制以及安全性考量比如对用户输入进行校验过滤等等措施保障整个应用的安全稳定运行。
此外,为了保证高并发下的性能问题,你可以引入Redis来进行负载均衡和缓存管理等功能增强系统弹性能力。
---
阅读全文
相关推荐

















