[python] PySimpleGUI를 사용하여 소켓 통신 구현하기

소개

소켓 통신은 네트워크 상에서 컴퓨터들이 데이터를 주고받기 위해 사용되는 일반적인 방법입니다. PySimpleGUI는 파이썬에서 사용하기 쉬운 GUI 라이브러리로, 이를 활용하여 소켓 통신을 구현할 수 있습니다. 이번 포스트에서는 PySimpleGUI를 사용하여 클라이언트와 서버 간의 소켓 통신을 구현하는 방법에 대해 알아보겠습니다.

필요한 패키지 설치

먼저, PySimpleGUI 패키지를 설치해야 합니다. 아래의 명령어를 사용하여 설치하세요.

pip install pysimplegui

클라이언트 구현

클라이언트 측에서는 PySimpleGUI를 사용하여 GUI를 생성하고, 서버와의 소켓 통신을 처리합니다. 아래는 간단한 클라이언트 구현의 예시입니다.

import PySimpleGUI as sg
import socket

def main():
    # GUI 생성
    layout = [
        [sg.Text('서버 주소'), sg.Input(key='-ADDRESS-')],
        [sg.Button('연결')],
        [sg.Text('메시지'), sg.Input(key='-MESSAGE-')],
        [sg.Button('전송')]
    ]
    window = sg.Window('클라이언트', layout)
    
    # 서버에 연결
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    connected = False
    
    while True:
        event, values = window.read()
        
        if event == sg.WINDOW_CLOSED:
            break
            
        if event == '연결' and not connected:
            server_address = values['-ADDRESS-']
            try:
                client_socket.connect((server_address, 5000))
                connected = True
                sg.popup('서버에 연결되었습니다!')
            except:
                sg.popup('서버 연결에 실패했습니다!')
                
        if event == '전송' and connected:
            message = values['-MESSAGE-']
            try:
                client_socket.sendall(message.encode())
                sg.popup('메시지를 전송했습니다!')
            except:
                sg.popup('메시지 전송에 실패했습니다!')
    
    window.close()

if __name__ == '__main__':
    main()

서버 구현

서버 측에서도 마찬가지로 PySimpleGUI를 사용하여 GUI를 생성하고, 클라이언트와의 소켓 통신을 처리합니다. 아래는 간단한 서버 구현의 예시입니다.

import PySimpleGUI as sg
import socket

def main():
    # GUI 생성
    layout = [
        [sg.Text('서버 주소'), sg.Input(key='-ADDRESS-')],
        [sg.Button('시작')],
        [sg.Output(size=(30, 10))]
    ]
    window = sg.Window('서버', layout)
    server_socket = None
    
    while True:
        event, values = window.read()
        
        if event == sg.WINDOW_CLOSED:
            break
            
        if event == '시작' and server_socket is None:
            server_address = values['-ADDRESS-']
            try:
                # 서버 소켓 생성 및 연결 대기
                server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                server_socket.bind((server_address, 5000))
                server_socket.listen()
                sg.popup('서버가 시작되었습니다!')
                while True:
                    # 클라이언트 연결 수락
                    client_socket, _ = server_socket.accept()
                    handle_client(client_socket)
                    
            except:
                sg.popup('서버 시작에 실패했습니다!')
    
    if server_socket:
        server_socket.close()
        
    window.close()

def handle_client(client_socket):
    while True:
        data = client_socket.recv(1024)
        if not data:
            break
        print(f'클라이언트로부터 메시지를 받았습니다: {data.decode()}')
        
    client_socket.close()

if __name__ == '__main__':
    main()

결론

위와 같이 PySimpleGUI를 사용하여 파이썬에서 소켓 통신을 간편하게 구현할 수 있습니다. PySimpleGUI는 사용하기 쉬운 인터페이스와 다양한 기능을 제공하므로, GUI 애플리케이션과 소켓 통신을 결합하여 다양한 프로그램을 개발할 수 있습니다.

참고 자료