카테고리 없음

내부 메신저 - 서버실행용

1231. 2025. 3. 22. 20:25

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)