# 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 = {} user_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 = user_rooms.get(request.sid) if room: leave_room(room) username = rooms[room].pop(request.sid, None) del user_rooms[request.sid] if username: socketio.emit('update_user_list', list(rooms[room].values()), room=room) if not rooms[room]: del rooms[room] socketio.emit('user_left', username, room=room) @socketio.on('join') def on_join(data): room = data['room'] username = data['username'] join_room(room) if room not in rooms: rooms[room] = {} rooms[room][request.sid] = username user_rooms[request.sid] = room logging.info(f"User {username} ({request.sid}) joined room {room}") socketio.emit('user_joined', username, room=room, skip_sid=request.sid) socketio.emit('update_user_list', list(rooms[room].values()), room=room) socketio.emit('message', {'type': 'system', 'msg': f'{username} 加入了房间'}, room=room) @socketio.on('leave') def on_leave(): room = user_rooms.get(request.sid) if room: username = rooms[room].pop(request.sid, None) leave_room(room) del user_rooms[request.sid] logging.info(f"User {username} ({request.sid}) left room {room}") socketio.emit('user_left', username, room=room) socketio.emit('update_user_list', list(rooms[room].values()), room=room) socketio.emit('message', {'type': 'system', 'msg': f'{username} 离开了房间'}, room=room) @socketio.on('offer') def handle_offer(data): data['sender'] = rooms[user_rooms[request.sid]][request.sid] logging.info(f"Offer from {data['sender']} to {data.get('target')}") socketio.emit('offer', data, room=data.get('target')) @socketio.on('answer') def handle_answer(data): data['sender'] = rooms[user_rooms[request.sid]][request.sid] logging.info(f"Answer from {data['sender']} to {data.get('target')}") socketio.emit('answer', data, room=data.get('target')) @socketio.on('candidate') def handle_candidate(data): data['sender'] = rooms[user_rooms[request.sid]][request.sid] logging.info(f"ICE candidate from {data['sender']} 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)