tianyun 3 månader sedan
förälder
incheckning
b9234a9dc0
2 ändrade filer med 31 tillägg och 14 borttagningar
  1. 20 10
      chat-room/main.py
  2. 11 4
      chat-room/templates/room.html

+ 20 - 10
chat-room/main.py

@@ -3,14 +3,15 @@ from flask import Flask, render_template, request
 from flask_socketio import SocketIO, join_room, leave_room
 from flask_cors import CORS
 import logging
+import os
 
 app = Flask(__name__)
 CORS(app, resources={r"/*": {"origins": "*"}})
-app.config['SECRET_KEY'] = 'secret!'
-socketio = SocketIO(app, cors_allowed_origins="*", logger=True, engineio_logger=True)
+app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'secret!')
+socketio = SocketIO(app, cors_allowed_origins="*", logger=True, engineio_logger=True, ping_timeout=60)
 
 # 配置日志
-logging.basicConfig(level=logging.DEBUG)
+logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
 
 rooms = {}
 
@@ -21,6 +22,11 @@ def on_connect():
 @socketio.on('disconnect')
 def on_disconnect():
     logging.info(f"Client disconnected: {request.sid}")
+    room = rooms.get(request.sid)
+    if room:
+        leave_room(room)
+        del rooms[request.sid]
+        socketio.emit('user_left', request.sid, room=room)
 
 @socketio.on('join')
 def on_join(data):
@@ -44,24 +50,28 @@ def on_leave():
 @socketio.on('offer')
 def handle_offer(data):
     data['sender'] = request.sid
-    logging.info(f"Offer from {request.sid} to {data['target']}")
-    socketio.emit('offer', data, room=data['target'])
+    logging.info(f"Offer from {request.sid} to {data.get('target')}")
+    socketio.emit('offer', data, room=data.get('target'))
 
 @socketio.on('answer')
 def handle_answer(data):
     data['sender'] = request.sid
-    logging.info(f"Answer from {request.sid} to {data['target']}")
-    socketio.emit('answer', data, room=data['target'])
+    logging.info(f"Answer from {request.sid} to {data.get('target')}")
+    socketio.emit('answer', data, room=data.get('target'))
 
 @socketio.on('candidate')
 def handle_candidate(data):
     data['sender'] = request.sid
-    logging.info(f"ICE candidate from {request.sid} to {data['target']}")
-    socketio.emit('candidate', data, room=data['target'])
+    logging.info(f"ICE candidate from {request.sid} to {data.get('target')}")
+    socketio.emit('candidate', data, room=data.get('target'))
 
 @app.route('/room/<room_id>')
 def room(room_id):
     return render_template('room.html', room_id=room_id)
 
+@socketio.on_error()
+def error_handler(e):
+    logging.error(f"SocketIO error: {str(e)}")
+
 if __name__ == '__main__':
-    socketio.run(app, host='0.0.0.0', port=15000, debug=True, allow_unsafe_werkzeug=True)
+    socketio.run(app, host='0.0.0.0', port=int(os.environ.get('PORT', 15000)), debug=False)

+ 11 - 4
chat-room/templates/room.html

@@ -21,11 +21,12 @@
 
     // 初始化WebSocket连接
     function initSocket() {
-        socket = io({
-            transports: ['websocket'],
-            upgrade: false,
+        socket = io('https://chatroom.tianyunperfect.cn', {
+            transports: ['websocket', 'polling'],
+            upgrade: true,
             reconnection: true,
-            reconnectionAttempts: 5
+            reconnectionAttempts: 5,
+            path: '/socket.io'
         });
 
         socket.on('connect', () => {
@@ -49,6 +50,12 @@
 
     initSocket();
 
+    // 添加错误处理
+    window.onerror = function(message, source, lineno, colno, error) {
+        console.error('Caught error:', error);
+        document.getElementById('status').innerHTML = "发生错误: " + message;
+    };
+
       // 获取麦克风权限
       async function init() {
         try {