[파이썬] socket GUI 애플리케이션에서 소켓 활용

소켓(socket)은 네트워크 통신에 사용되는 도구로, 클라이언트와 서버 간의 데이터 교환을 가능하게 해줍니다. 이번 블로그 포스트에서는 Python 언어를 사용하여 Socket을 활용한 GUI(Graphical User Interface) 애플리케이션을 개발하는 방법에 대해 알아보겠습니다.

PyQt를 이용한 GUI 애플리케이션 개발

Python에서 GUI 애플리케이션을 개발하는 가장 일반적인 방법은 PyQt를 사용하는 것입니다. PyQt는 Qt 프레임워크의 Python 바인딩으로, 다양한 플랫폼에서 사용할 수 있는 강력한 GUI 도구입니다. 우리는 PyQt를 사용하여 Socket을 활용한 애플리케이션을 개발할 것입니다.

소켓 통신을 위한 모듈 임포트

먼저, 소켓 통신을 위해 socket 모듈을 임포트합니다.

import socket

클라이언트 소켓 생성

클라이언트 애플리케이션에서는 서버에 연결하기 위한 소켓을 생성해야 합니다. 이를 위해 socket.socket() 함수를 호출하여 클라이언트 소켓을 생성합니다.

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

위의 코드에서 AF_INET은 IPv4 주소 체계를 사용하고 SOCK_STREAM은 TCP 프로토콜을 사용한다는 의미입니다.

서버 소켓 생성

서버 애플리케이션에서는 클라이언트의 연결을 기다리기 위한 소켓을 생성해야 합니다. 이를 위해 클라이언트 소켓과 비슷한 방식으로 socket.socket() 함수를 호출하여 서버 소켓을 생성합니다.

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

소켓 연결

클라이언트는 서버에 연결하기 위해 connect() 함수를 사용합니다.

client_socket.connect(('서버 IP 주소', 포트번호))

서버는 클라이언트의 연결을 기다리기 위해 bind() 함수와 listen() 함수를 사용합니다.

server_socket.bind(('서버 IP 주소', 포트번호))
server_socket.listen(1)  # 이 경우 최대 1개의 클라이언트 연결 허용

소켓 통신

클라이언트와 서버 사이에서 데이터를 주고받기 위해 send()recv() 함수를 사용할 수 있습니다. 이 함수들은 바이트(Byte) 형태의 데이터를 이동시키므로 필요에 따라 데이터를 인코딩하고 디코딩해야 합니다.

message = 'Hello, server!'
client_socket.send(message.encode())  # 바이트로 변환하여 전송
data = server_socket.recv(1024)  # 최대 1024바이트까지 데이터 수신
message = data.decode()  # 디코딩하여 문자열로 변환

PyQt를 이용한 Socket GUI 애플리케이션 예제

아래는 PyQt를 이용하여 Socket을 활용한 간단한 GUI 애플리케이션의 예제입니다.

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QVBoxLayout, QWidget
import socket

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Socket GUI 애플리케이션")
        self.setGeometry(100, 100, 400, 200)

        layout = QVBoxLayout()

        self.label = QLabel("Waiting for message...")
        layout.addWidget(self.label)

        button = QPushButton("Send Message")
        button.clicked.connect(self.send_message)
        layout.addWidget(button)

        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server_socket.bind(('localhost', 8000))
        self.server_socket.listen(1)

    def send_message(self):
        client_socket, addr = self.server_socket.accept()
        message = 'Hello, client!'
        client_socket.send(message.encode())
        data = client_socket.recv(1024)
        message = data.decode()
        self.label.setText(f"Received message: {message}")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

위의 예제는 PyQt의 QMainWindow 클래스를 상속받은 MainWindow 클래스를 정의한 후, GUI 요소와 소켓 통신 부분을 구현하고 있습니다. 애플리케이션 실행 시 “Socket GUI 애플리케이션” 타이틀의 창과 “Send Message” 버튼, 메시지를 표시할 레이블이 표시됩니다. 버튼을 클릭하면 서버 소켓을 통해 클라이언트에게 메시지를 전송하고, 클라이언트로부터 받은 메시지를 레이블에 표시합니다.

이처럼 Python 언어의 Socket과 PyQt를 조합하여 소켓 활용한 GUI 애플리케이션을 개발할 수 있습니다. Socket을 이용하면 클라이언트와 서버 간의 실시간 데이터 송수신이 가능해지므로, 다양한 네트워크 기반 애플리케이션 개발에 활용할 수 있습니다.