#include "socketmanager.h" // 헤더 파일 포함
#include <QJsonDocument> // JSON 문서 객체 사용
#include <QJsonObject> // JSON 객체 사용
#include <QJsonParseError> // JSON 파싱 오류 처리용
// 정적 멤버 함수: SocketManager 싱글톤 객체 반환
SocketManager* SocketManager::instance() {
static SocketManager* instance = new SocketManager(); // 프로그램 전체에서 하나의 인스턴스만 생성
return instance;
}
// 생성자: TCP 소켓 초기화 및 서버 연결 시도
SocketManager::SocketManager(QObject *parent): QObject{parent}
{
m_socket = new QTcpSocket(this); // TCP 소켓 객체 생성
connect(m_socket, &QTcpSocket::connected, this, &SocketManager::onConnected); // 연결 성공 시 슬롯 연결
connect(m_socket, &QTcpSocket::disconnected, this, &SocketManager::onDisconnected); // 연결 종료 시 슬롯 연결
connect(m_socket, &QTcpSocket::readyRead, this, &SocketManager::onReadyRead); // 데이터 수신 시 슬롯 연결
connect(m_socket, QOverload<QAbstractSocket::SocketError>::of(&QTcpSocket::errorOccurred),
this, &SocketManager::onErrorOccurred); // 오류 발생 시 슬롯 연결
m_socket->connectToHost("10.10.20.102", 9959); // 서버 IP 및 포트에 연결 시도
}
// 소켓 객체 반환 함수 (외부에서 접근 시 사용)
QTcpSocket* SocketManager::socket() {
return m_socket; // 내부 소켓 포인터 반환
}
// 연결 성공 시 호출되는 슬롯
void SocketManager::onConnected() {
emit connected(); // 연결 시그널 방출
}
// 연결 종료 시 호출되는 슬롯
void SocketManager::onDisconnected() {
emit disconnected(); // 연결 종료 시그널 방출
}
// 오류 발생 시 호출되는 슬롯
void SocketManager::onErrorOccurred(QAbstractSocket::SocketError socketError) {
Q_UNUSED(socketError); // socketError 미사용
emit errorOccurred(m_socket->errorString()); // 오류 메시지 방출
}
// 데이터 수신 시 호출되는 슬롯
void SocketManager::onReadyRead() {
m_buffer.append(m_socket->readAll()); // 데이터 버퍼에 추가
while (m_buffer.contains('\n')) { // JSON 메시지는 개행으로 구분된다고 가정
int index = m_buffer.indexOf('\n');
QByteArray line = m_buffer.left(index); // 한 줄 단위 메시지 추출
m_buffer.remove(0, index + 1); // 추출된 부분 제거
QJsonParseError parseError;
QJsonDocument doc = QJsonDocument::fromJson(line, &parseError); // JSON 파싱
if (parseError.error == QJsonParseError::NoError && doc.isObject()) {
emit jsonReceived(doc.object()); // 정상 JSON 응답 시그널 방출
}
}
}
주코딩일지