main.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. # app.py
  2. from flask import Flask, render_template, request
  3. from flask_socketio import SocketIO, join_room, leave_room
  4. from flask_cors import CORS
  5. import logging
  6. import os
  7. app = Flask(__name__)
  8. CORS(app, resources={r"/*": {"origins": "*"}})
  9. app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'secret!')
  10. socketio = SocketIO(app, cors_allowed_origins="*", logger=True, engineio_logger=True, ping_timeout=60)
  11. # 配置日志
  12. logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
  13. rooms = {}
  14. @socketio.on('connect')
  15. def on_connect():
  16. logging.info(f"Client connected: {request.sid}")
  17. @socketio.on('disconnect')
  18. def on_disconnect():
  19. logging.info(f"Client disconnected: {request.sid}")
  20. room = rooms.get(request.sid)
  21. if room:
  22. leave_room(room)
  23. del rooms[request.sid]
  24. socketio.emit('user_left', request.sid, room=room)
  25. @socketio.on('join')
  26. def on_join(data):
  27. room = data['room']
  28. join_room(room)
  29. rooms[request.sid] = room
  30. logging.info(f"User {request.sid} joined room {room}")
  31. socketio.emit('user_joined', request.sid, room=room, skip_sid=request.sid)
  32. socketio.emit('message', {'type': 'system', 'msg': '新用户加入'}, room=room)
  33. @socketio.on('leave')
  34. def on_leave():
  35. room = rooms.get(request.sid)
  36. if room:
  37. leave_room(room)
  38. del rooms[request.sid]
  39. logging.info(f"User {request.sid} left room {room}")
  40. socketio.emit('user_left', request.sid, room=room)
  41. socketio.emit('message', {'type': 'system', 'msg': '用户离开'}, room=room)
  42. @socketio.on('offer')
  43. def handle_offer(data):
  44. data['sender'] = request.sid
  45. logging.info(f"Offer from {request.sid} to {data.get('target')}")
  46. socketio.emit('offer', data, room=data.get('target'))
  47. @socketio.on('answer')
  48. def handle_answer(data):
  49. data['sender'] = request.sid
  50. logging.info(f"Answer from {request.sid} to {data.get('target')}")
  51. socketio.emit('answer', data, room=data.get('target'))
  52. @socketio.on('candidate')
  53. def handle_candidate(data):
  54. data['sender'] = request.sid
  55. logging.info(f"ICE candidate from {request.sid} to {data.get('target')}")
  56. socketio.emit('candidate', data, room=data.get('target'))
  57. @app.route('/room/<room_id>')
  58. def room(room_id):
  59. return render_template('room.html', room_id=room_id)
  60. @socketio.on_error()
  61. def error_handler(e):
  62. logging.error(f"SocketIO error: {str(e)}")
  63. if __name__ == '__main__':
  64. socketio.run(app, host='0.0.0.0', port=int(os.environ.get('PORT', 15000)), debug=False)