0. 학습 순서

 

1. PySide6 네트워크 실행 흐름 비교

 

2. 서버 코드와 실행 흐름

더보기

(1) 서버(Server) 실행 흐름

  • 준비 → 대기 → 수락 → 송수신 → 종료

 

 

 

 

(2) 서버 실행 흐름 단계

 

[1] 서버 소켓 생성

# “연결 요청을 받을 창구”를 만든다.
server = QTcpServer()

 

 

[2] 바인딩 + 리슨 시작

# “이 IP/Port로 들어오는 연결 요청을 받을 준비 완료”
# 성공하면 서버는 대기 상태(클라이언트 요청 대기)로 진입한다.
server.listen(address, port)

 

 

 [3] pendingConnectionSocket 획득

# 서버 소켓이 연결 소켓 생성
sock = server.nextPendingConnection()



[4] 연결된 소켓의 Signal - Slot 연결

sock.readyRead 시그널 → 데이터 수신 슬롯 함수
sock.disconnected 시그널 → 연결 종료 처리



[5] 데이터 송수신

수신: readyRead 시스널 → sock.readAll() 슬롯 함수 동작
송신: 필요 시 sock.write(bytes) 전송



 [6] 연결 종료 처리

클라이언트가 끊으면 disconnected 발생
서버는 소켓 정리(remove, deleteLater)

 

 

 

 

(3) 서버 간단 예시 코드

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QLabel
from PySide6.QtNetwork import QTcpServer, QHostAddress


class ServerWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Server Window")
        self.resize(400, 200)  # 창 크기

        self.label = QLabel("Waiting...", self)
        self.label.setGeometry(50, 50, 300, 50)
        
        # [1]
        self.server = QTcpServer(self)
        self.server.newConnection.connect(self.on_new_connection)

        # 가장 단순한 안전장치: 연결 소켓을 저장
        self.client_socket = None
        
        # [2] 
        ok = self.server.listen(QHostAddress("127.0.0.1"), 8888)
        if not ok:
            self.label.setText("Listen failed")

    def on_new_connection(self):
        # [3] 
        self.client_socket = self.server.nextPendingConnection()
        # [4] 
        self.client_socket.readyRead.connect(self.on_ready_read)

        self.label.setText("Client connected")

    def on_ready_read(self):
        # [5] 
        data = self.client_socket.readAll()
        message = bytes(data).decode(errors="replace")
        self.label.setText(f"Received: {message}")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = ServerWindow()
    w.show()
    sys.exit(app.exec())

 

3. 클라이언트 코드와 실행 흐름

더보기

(1) 클라이언트(Client) 실행 흐름

  • 준비 → 연결 → 송수신 → 종료

 

 

 

 

(2) 클라이언트 실행 흐름 단계

 

[1] 클라이언트 소켓 생성

sock = QTcpSocket()



[2] 서버로 연결 요청

sock.connectToHost(host, port)


“서버로 TCP 연결을 시도한다.”
이 호출 직후 연결이 즉시 완료된다는 보장은 없다.
연결 완료는 connected 시그널로 확인한다.

 


[3] 데이터 송/수신

sock.write(payload)
sock.readAll()로 수신

 


[4] 연결 종료

클라이언트가 종료하면 disconnectFromHost()

 

 

 

 

(3) 클라이언트 간단 예시 코드

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QLineEdit
from PySide6.QtNetwork import QTcpSocket


class ClientWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Client Window")

        self.line = QLineEdit(self)
        self.line.setGeometry(50, 50, 200, 30)

        btn = QPushButton("Send", self)
        btn.setGeometry(50, 100, 100, 30)
        btn.clicked.connect(self.send_message)

        # [1]
        self.socket = QTcpSocket(self)
        # [2]
        self.socket.connectToHost("127.0.0.1", 8888)

    def send_message(self):
        # [3]
        self.socket.write(self.line.text().encode())


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = ClientWindow()
    w.show()
    sys.exit(app.exec())

 

4. 소스코드 기반 흐름도