究极无敌稳定版

main
wang 1 month ago
parent d8833c9193
commit 9a9352b340

@ -40,7 +40,7 @@ EXPOSE 5001/udp
# 创建启动脚本 # 创建启动脚本
RUN echo '#!/bin/bash\n\ RUN echo '#!/bin/bash\n\
python voice_udp_server.py &\n\ python voice_udp_server.py &\n\
gunicorn --workers 2 --bind 0.0.0.0:5000 app:app\n\ gunicorn --workers 1 --worker-class eventlet --bind 0.0.0.0:5000 app:app\n\
' > /app/start.sh && chmod +x /app/start.sh ' > /app/start.sh && chmod +x /app/start.sh
# 使用启动脚本启动应用 # 使用启动脚本启动应用

@ -638,33 +638,36 @@ def handle_send_message(data):
if not room_id or not message_text: if not room_id or not message_text:
return return
# 获取用户和房间信息 try:
user = User.query.get(user_id) with app.app_context():
room = ChatRoom.query.get(room_id) user = User.query.get(user_id)
room = ChatRoom.query.get(room_id)
if not user or not room: if not user or not room:
return return
# 保存消息到数据库 message = ChatMessage(
message = ChatMessage( room_id=room_id,
room_id=room_id, user_id=user_id,
user_id=user_id, message=message_text,
message=message_text, message_type='text'
message_type='text' )
)
db.session.add(message) db.session.add(message)
db.session.commit() db.session.commit()
# 广播消息给房间内的所有用户 emit('new_message', {
emit('new_message', { 'id': message.id,
'id': message.id, 'user_id': user_id,
'user_id': user_id, 'username': user.username,
'username': user.username, 'message': message_text,
'message': message_text, 'message_type': 'text',
'message_type': 'text', 'created_at': message.created_at.isoformat()
'created_at': message.created_at.isoformat() }, room=str(room_id))
}, room=str(room_id))
except Exception as e:
logger.error(f"处理文本消息时出错: {e}")
db.session.rollback()
@socketio.on('send_audio_message') @socketio.on('send_audio_message')
def handle_send_audio_message(data): def handle_send_audio_message(data):
@ -704,39 +707,37 @@ def handle_send_audio_message(data):
logger.info(f"处理语音消息: 用户ID={user_id}, 房间ID={room_id}, 音频时长={audio_duration}秒, MIME类型={audio_mime_type}, 数据长度={len(audio_data)}") logger.info(f"处理语音消息: 用户ID={user_id}, 房间ID={room_id}, 音频时长={audio_duration}秒, MIME类型={audio_mime_type}, 数据长度={len(audio_data)}")
try: try:
# 获取用户和房间信息 with app.app_context():
user = User.query.get(user_id) user = User.query.get(user_id)
room = ChatRoom.query.get(room_id) room = ChatRoom.query.get(room_id)
if not user or not room: if not user or not room:
logger.error(f"用户或房间不存在: user_id={user_id}, room_id={room_id}") logger.error(f"用户或房间不存在: user_id={user_id}, room_id={room_id}")
return return
# 保存消息到数据库 message = ChatMessage(
message = ChatMessage( room_id=room_id,
room_id=room_id, user_id=user_id,
user_id=user_id, message=audio_data,
message=audio_data, # 存储Base64编码的音频数据 message_type='audio',
message_type='audio', audio_duration=audio_duration
audio_duration=audio_duration )
)
db.session.add(message)
db.session.add(message) db.session.commit()
db.session.commit() logger.info(f"语音消息已保存到数据库: ID={message.id}")
logger.info(f"语音消息已保存到数据库: ID={message.id}")
emit('new_message', {
# 广播消息给房间内的所有用户 'id': message.id,
emit('new_message', { 'user_id': user_id,
'id': message.id, 'username': user.username,
'user_id': user_id, 'message': audio_data,
'username': user.username, 'message_type': 'audio',
'message': audio_data, 'audio_duration': audio_duration,
'message_type': 'audio', 'audio_mime_type': audio_mime_type,
'audio_duration': audio_duration, 'created_at': message.created_at.isoformat()
'audio_mime_type': audio_mime_type, }, room=str(room_id))
'created_at': message.created_at.isoformat() logger.info(f"语音消息已广播到房间: {room_id}")
}, room=str(room_id))
logger.info(f"语音消息已广播到房间: {room_id}")
except Exception as e: except Exception as e:
logger.error(f"处理语音消息时出错: {e}") logger.error(f"处理语音消息时出错: {e}")

@ -0,0 +1,19 @@
# Dependencies
/node_modules
# Build files
/dist
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# IDE and editor directories
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

@ -1,3 +1,8 @@
upstream backend {
ip_hash;
server backend:5000;
}
server { server {
listen 80 default_server; listen 80 default_server;
listen [::]:80 default_server; listen [::]:80 default_server;
@ -76,7 +81,7 @@ server {
# API请求代理到后端服务 # API请求代理到后端服务
location /api/ { location /api/ {
proxy_pass http://backend:5000; proxy_pass http://backend;
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@ -88,7 +93,7 @@ server {
# Socket.IO请求代理到后端服务 # Socket.IO请求代理到后端服务
location /socket.io/ { location /socket.io/ {
proxy_pass http://backend:5000; proxy_pass http://backend;
proxy_http_version 1.1; proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade"; proxy_set_header Connection "upgrade";
@ -104,7 +109,7 @@ server {
# 支持WebRTC信令转发 # 支持WebRTC信令转发
location /rtc/ { location /rtc/ {
proxy_pass http://backend:5000; proxy_pass http://backend;
proxy_http_version 1.1; proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade"; proxy_set_header Connection "upgrade";

File diff suppressed because one or more lines are too long

@ -310,14 +310,10 @@ export default {
// Socket // Socket
const initSocketConnection = () => { const initSocketConnection = () => {
// Socket // URL
const currentHost = window.location.hostname; socket = io({
const url = `http://${currentHost}:5000`;
// 使WebSocket
socket = io(url, {
withCredentials: true, withCredentials: true,
transports: ['polling'], // pathNginx
path: '/socket.io' path: '/socket.io'
}); });

Loading…
Cancel
Save