1-3 단계: 소스코드와 실행 흐름

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. 소스코드 기반 흐름도


