# app.py 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'] = 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, format='%(asctime)s - %(levelname)s - %(message)s') rooms = {} @socketio.on('connect') def on_connect(): logging.info(f"Client connected: {request.sid}") @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): room = data['room'] join_room(room) rooms[request.sid] = room logging.info(f"User {request.sid} joined room {room}") socketio.emit('user_joined', request.sid, room=room, skip_sid=request.sid) socketio.emit('message', {'type': 'system', 'msg': '新用户加入'}, room=room) @socketio.on('leave') def on_leave(): room = rooms.get(request.sid) if room: leave_room(room) del rooms[request.sid] logging.info(f"User {request.sid} left room {room}") socketio.emit('user_left', request.sid, room=room) socketio.emit('message', {'type': 'system', 'msg': '用户离开'}, room=room) @socketio.on('offer') def handle_offer(data): data['sender'] = request.sid 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.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.get('target')}") socketio.emit('candidate', data, room=data.get('target')) @app.route('/room/') 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=int(os.environ.get('PORT', 15000)), debug=False)