123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- # 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/<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=int(os.environ.get('PORT', 15000)), debug=False)
|