카테고리 없음

팡팡이츠 - SocketManager를 응용한 처리 코드 [채팅/주문]

joo_coding 2025. 6. 13. 21:26

✅ 1. 채팅 처리 로직

📤 클라이언트 → 서버: 채팅 보내기

 
void sendChatMessage(const QString& from, const QString& to, const QString& message) {
    QJsonObject data;
    data["from"] = from;
    data["to"] = to;
    data["message"] = message;

    QJsonObject request;
    request["action"] = "chat_send";
    request["data"] = data;

    QJsonDocument doc(request);
    QByteArray msg = doc.toJson(QJsonDocument::Compact) + "\n";

    SocketManager::instance()->socket()->write(msg);
}

 

📥 서버 → 클라이언트: 채팅 수신 처리

SocketManager의 jsonReceived 신호에 연결해서 처리:

connect(SocketManager::instance(), &SocketManager::jsonReceived, this, [=](QJsonObject json){
    if (json["action"].toString() == "chat_receive") {
        QJsonObject data = json["data"].toObject();
        QString from = data["from"].toString();
        QString message = data["message"].toString();
        QString time = data["sent_time"].toString(); // 시간은 서버에서 옵션으로 줄 수 있음

        ui->chatTextBrowser->append(QString("[%1] %2").arg(from, message));
    }
});

 

 

 

✅ 2. 주문 처리 로직

📤 클라이언트 → 서버: 주문 생성 요청

void sendOrder(const QString& user_id, const QString& store_id, const QJsonArray& items) {
    QJsonObject data;
    data["customer_id"] = user_id;
    data["store_id"] = store_id;
    data["items"] = items;
    data["address"] = "서울시 예시구 예시로 123"; // 사용자 주소

    QJsonObject request;
    request["action"] = "create_order";
    request["data"] = data;

    QJsonDocument doc(request);
    QByteArray msg = doc.toJson(QJsonDocument::Compact) + "\n";

    SocketManager::instance()->socket()->write(msg);
}

📌 예시 items 형식

QJsonArray items;
QJsonObject item1;
item1["menu_id"] = 1001;
item1["name"] = "치킨마요";
item1["qty"] = 2;
items.append(item1);

QJsonObject item2;
item2["menu_id"] = 1005;
item2["name"] = "콜라";
item2["qty"] = 1;
items.append(item2);

 

 

📥 서버 → 클라이언트: 주문 결과 수신

connect(SocketManager::instance(), &SocketManager::jsonReceived, this, [=](QJsonObject json){
    QString action = json["action"].toString();
    
    if (action == "order_result") {
        QJsonObject data = json["data"].toObject();
        QString status = data["status"].toString();
        QString orderId = data["order_id"].toString();
        
        if (status == "success") {
            QMessageBox::information(this, "주문 완료", "주문번호: " + orderId);
        } else {
            QMessageBox::warning(this, "주문 실패", "사유: " + data["message"].toString());
        }
    }
});

order_result 형태로 응답하도록 서버와 합의해야 함.

 

  • SocketManager::sendJson(QJsonObject) 함수 만들어두면 편리함

 

✅ 확장 가능한 예시들

  • "get_order_status" 요청 → 주문 상태 추적
  • "request_dispatch" → 라이더 배차 신청
  • "start_delivery" → 배달 시작 시각 기록