웹사이트 검색

Python 소켓 프로그래밍 - 서버, 클라이언트 예제


좋은 하루 학습자! 이전 튜토리얼에서 Python unittest 모듈에 대해 논의했습니다. 오늘은 파이썬 소켓 프로그래밍 예제에 대해 알아보겠습니다. 우리는 파이썬 소켓 서버와 클라이언트 애플리케이션을 만들 것입니다.

Python 소켓 프로그래밍

Python 소켓 프로그래밍을 이해하려면 소켓 서버, 소켓 클라이언트 및 소켓이라는 세 가지 흥미로운 주제에 대해 알아야 합니다. 그렇다면 서버란 무엇인가? 글쎄, 서버는 클라이언트 요청을 기다리고 그에 따라 서비스를 제공하거나 처리하는 소프트웨어입니다. 반면 클라이언트는 이 서비스의 요청자입니다. 서버에 대한 일부 자원에 대한 클라이언트 프로그램 요청 및 서버는 해당 요청에 응답합니다. 소켓은 서버와 클라이언트 간의 양방향 통신 채널의 끝점입니다. 소켓은 프로세스 내에서, 동일한 시스템의 프로세스 간에 또는 다른 시스템의 프로세스 간에 통신할 수 있습니다. 원격 프로그램과 통신하려면 소켓 포트를 통해 연결해야 합니다. 이 소켓 프로그래밍 자습서의 주요 목표는 소켓 서버와 클라이언트가 서로 통신하는 방법을 소개하는 것입니다. 또한 파이썬 소켓 서버 프로그램을 작성하는 방법도 배웁니다.

Python 소켓 예제

앞에서 소켓 클라이언트가 소켓 서버에 일부 리소스를 요청하고 서버가 해당 요청에 응답한다고 말했습니다. 그래서 우리는 서버와 클라이언트 모델 모두 서로 통신할 수 있도록 설계할 것입니다. 단계는 다음과 같이 생각할 수 있습니다.

  1. Python 소켓 서버 프로그램은 처음에 실행되고 모든 요청을 기다립니다.
  2. Python 소켓 클라이언트 프로그램이 처음에 대화를 시작합니다.
  3. 그러면 서버 프로그램이 클라이언트 요청에 따라 응답합니다.
  4. 사용자가 "bye\ 메시지를 입력하면 클라이언트 프로그램이 종료됩니다. 클라이언트 프로그램이 종료되면 서버 프로그램도 종료됩니다. 이는 선택 사항이며 서버 프로그램을 무기한 실행하거나 클라이언트 요청에서 특정 명령으로 종료할 수 있습니다.

파이썬 소켓 서버

Python 소켓 서버 프로그램을 socket_server.py로 저장합니다. Python 소켓 연결을 사용하려면 소켓 모듈을 가져와야 합니다. 그런 다음 순차적으로 서버와 클라이언트 간의 연결을 설정하는 몇 가지 작업을 수행해야 합니다. socket.gethostname() 함수를 사용하여 호스트 주소를 얻을 수 있습니다. 1024 미만의 포트 번호는 표준 인터넷 프로토콜용으로 예약되어 있으므로 1024 이상의 사용자 포트 주소를 사용하는 것이 좋습니다. 아래의 Python 소켓 서버 예제 코드를 참조하십시오. 주석은 코드를 이해하는 데 도움이 됩니다.

import socket


def server_program():
    # get the hostname
    host = socket.gethostname()
    port = 5000  # initiate port no above 1024

    server_socket = socket.socket()  # get instance
    # look closely. The bind() function takes tuple as argument
    server_socket.bind((host, port))  # bind host address and port together

    # configure how many client the server can listen simultaneously
    server_socket.listen(2)
    conn, address = server_socket.accept()  # accept new connection
    print("Connection from: " + str(address))
    while True:
        # receive data stream. it won't accept data packet greater than 1024 bytes
        data = conn.recv(1024).decode()
        if not data:
            # if data is not received break
            break
        print("from connected user: " + str(data))
        data = input(' -> ')
        conn.send(data.encode())  # send data to the client

    conn.close()  # close the connection


if __name__ == '__main__':
    server_program()

따라서 우리의 파이썬 소켓 서버는 포트 5000에서 실행 중이며 클라이언트 요청을 기다립니다. 클라이언트 연결이 닫힐 때 서버가 종료되지 않도록 하려면 Python while 루프를 제거하여 서버 프로그램을 무한정 실행하고 클라이언트 요청을 계속 기다리십시오.

Python 소켓 클라이언트

Python 소켓 클라이언트 프로그램을 socket_client.py로 저장합니다. 이 프로그램은 바인딩을 제외하면 서버 프로그램과 유사합니다. 서버 프로그램과 클라이언트 프로그램의 주요 차이점은 서버 프로그램에서는 호스트 주소와 포트 주소를 함께 바인딩해야 한다는 것입니다. 아래의 Python 소켓 클라이언트 예제 코드를 참조하십시오. 주석은 코드를 이해하는 데 도움이 됩니다.

import socket


def client_program():
    host = socket.gethostname()  # as both code is running on same pc
    port = 5000  # socket server port number

    client_socket = socket.socket()  # instantiate
    client_socket.connect((host, port))  # connect to the server

    message = input(" -> ")  # take input

    while message.lower().strip() != 'bye':
        client_socket.send(message.encode())  # send message
        data = client_socket.recv(1024).decode()  # receive response

        print('Received from server: ' + data)  # show in terminal

        message = input(" -> ")  # again take input

    client_socket.close()  # close the connection


if __name__ == '__main__':
    client_program()

Python 소켓 프로그래밍 출력

pankaj$ python3.6 socket_server.py 
Connection from: ('127.0.0.1', 57822)
from connected user: Hi
 -> Hello
from connected user: How are you?
 -> Good
from connected user: Awesome!
 -> Ok then, bye!
pankaj$
pankaj$ python3.6 socket_client.py 
 -> Hi
Received from server: Hello
 -> How are you?
Received from server: Good
 -> Awesome!
Received from server: Ok then, bye!
 -> Bye
pankaj$

소켓 서버가 포트 5000에서 실행 중이지만 클라이언트도 서버에 연결하려면 소켓 포트가 필요합니다. 이 포트는 클라이언트 연결 호출에 의해 무작위로 할당됩니다. 이 경우에는 57822입니다. 따라서 Python 소켓 프로그래밍, Python 소켓 서버 및 소켓 클라이언트 예제 프로그램의 전부입니다. 참조: 공식 문서