pip uninstall flask werkzeug -y
pip install flask --upgrade
from flask import Flask, request, jsonify
from queue import Queue, Full
app = Flask(__name__)
message_queues = {}
client_rooms = {}
clients = set()
MAX_QUEUE_SIZE = 10000 # 큐의 최대 크기 제한
@app.route('/register', methods=['POST'])
def register_client():
data = request.get_json()
client_id = data['client_id']
room = data.get('room', '')
if client_id not in message_queues:
message_queues[client_id] = Queue(maxsize=MAX_QUEUE_SIZE)
clients.add(client_id)
client_rooms[client_id] = room
return jsonify({"status": "success"})
@app.route('/send', methods=['POST'])
def send_message():
try:
data = request.get_json()
sender_id = data['sender_id']
message = data['message']
room = client_rooms.get(sender_id, "")
message_data = {"sender_id": sender_id, "message": message}
# 같은 PIN에 속한 클라이언트에게만 메시지 전송
for client_id in clients:
if client_id != sender_id and client_rooms.get(client_id, "") == room:
try:
message_queues[client_id].put_nowait(message_data)
except Full:
message_queues[client_id].get() # 가장 오래된 메시지 삭제 후 넣기
message_queues[client_id].put_nowait(message_data)
return jsonify({"status": "success"})
except Exception as e:
return jsonify({"status": "error", "message": str(e)}), 400
@app.route('/receive', methods=['POST'])
def receive_messages():
client_id = request.get_json()['client_id']
if client_id in message_queues:
messages = []
while not message_queues[client_id].empty():
messages.append(message_queues[client_id].get())
return jsonify({"messages": messages})
return jsonify({"messages": []})
@app.route('/unregister', methods=['POST'])
def unregister_client():
client_id = request.get_json()['client_id']
if client_id in clients:
clients.remove(client_id)
del message_queues[client_id]
if client_id in client_rooms:
del client_rooms[client_id]
return jsonify({"status": "success"})
@app.route('/', methods=['GET'])
def home():
return "Hello World"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True, use_reloader=False)