파이썬 소켓 프로그래밍 (Python Socket Programming)




소켓/네트워크 프로그래밍

with Python

  • 서버 구현

import socket  # 소켓통신을 위한 모듈을 불러온다.

addr = ("0.0.0.0", 5000)  # 0.0.0.0은 응용프로그램이 모든 Local 인터페이스를 들을 수 있고, 
                          # 당신이 그들을 어떤 것의 포트와도 연결될 수 있음을 의미!

with socket.socket() as s:  # s = socket.socket() 과 같은 표현 -> 소켓 객채를 생성!
                            # with문 들여쓰기 된 부분이 끝날 때 자동으로 파일이나 소켓을 close!

    s.bind(addr)  # addr은 (hostname, port number pair)로 구성되어 있으며, 소켓을 바인딩(묶음)!

    s.listen()  # TCP 리스너를 Start!  (이제 connect가 올 때까지 대기)

    conn, addr = s.accept()  # 클라이언트로부터 connect가 왔을 때 (클라이언트와 통신할 수 있는 소켓, 클라이언트 주소 정보)가 반환!

    print("client = {}: {}".format(addr[0],addr[1]))  # 클라이언트의 ip address, port를 출력!

    data = conn.recv(1024)  # 소켓에서 (bufsize) 만큼 데이터를 수신! [1]

    conn.send(data)  # 받은 데이터를 클라이언트로 다시 전송! [2]

print(data.decode())  # 클라이언트에서 echo한 데이터를 출력

  • 클라이언트 구현

import socket

addr = ("127.0.0.1", 5000)  # 통신하게 될 서버의 주소와 포트를 addr에 저장! (127.0.0.1은 자기 자신을 의미)

with socket.socket() as s:

    s.connect(addr)  # 지정된 주소로 TCP 서버 연결을 시도! -> 서버의 accept함수가 실행!

    str1 = input("echo: ").encode() # input을 통해 서버로 전송하게 될 메시지를 입력! (인코드를 하면 데이터가 깨지지 않음)

    s.send(str1)  # 서버가 recv함수로 대기하고 있을 때, str1 데이터를 서버로 전송! [1]

    data = s.recv(1024)  # 서버가 전송한 데이터를 수신! [2]

    
print(data.decode())  # 내가 입력했던 echo데이터를 주고 받은 후 출력! (원본 데이터 -> 인코드 -> 디코드 -> 원본 데이터)

[1]: 클라이언트에서 서버로 echo데이터 전송(send)  -> 서버가 수신(recv)
[2]: 서버에서 클라이언트로 echo데이터 전송(send) -> 클라이언트가 수신(recv)


  • 실행 결과


  1. 서버 


  1. 클라이언트

댓글