본문 바로가기

프로그래밍/Practice

간단한 에코 서버/클라이언트 만들기

Socket 이란?

- IP 주소와 포트 번호 쌍
- 컴퓨터 네트워크 프로세스 간 통신 종단을 뜻함

TCP 서버/클라이언트 구현 로직

에코 서버 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import socket
 
HOST = ''   #IP
PORT = 5001 #포트번호
 
def runServer():
    #TCP 소켓을 생성, socket 객체를 sock으로 지정
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:     
        sock.bind((HOST, PORT))     #소켓을 IP(프로그램이 구동되는 컴퓨터의 IP를 자동 할당)와 포트번호로 바인딩
        sock.listen(1)              #listen 상태로 서버가 한 번에 처리 가능 수는 1로 설정 (5까지 가능)
        print('클라이언트 연결 기다리는 중.......')
        conn, addr = sock.accept()  #클라이언트 연결되면 TCP 소켓과 클라이언트 주소를 리턴
        with conn:
            print('[%s]와 연결됨' %addr[0])
            while True:
                data = conn.recv(1024)  #conn.recv()는 데이터를 수신할 버퍼 (1024~4096 사이 값을 권장)
                if not data:
                    break
                #수신한 데이터는 이진 바이트 스트림 이기때문에 decode()으로 문자열 변환 후 
                print('메시지 수신 [%s]' %data.decode()) 
                conn.sendall(data)  #수신한 데이터를 다시 클라이언트로 전송
 
runServer()
cs

실행화면

에코 클라이언트 만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import socket
 
HOST = 'localhost'  #서버 IP주소
PORT = 5001         #서버의 포트번호
 
# TCP 소켓 생성, socket 객체를 sock으로 지정
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: 
    sock.connect((HOST,PORT))   #원격 호스트로 연결 시도
    msg = input('입력 : ')
    sock.sendall(msg.encode())  #메시지를 바이트 스트림으로 인코딩후 소켓 서버로 전송
    data = sock.recv(1024)      #서버로 부터 수신할 데이터
 
#수신한 데이터는 이진 바이트 스트림이기 때문에 decode()으로 문자열 변환 후 출력
print('에코 서버로부터 받은 메시지 [%s]' %data.decode())    
cs

실행화면




참고문헌

장삼용, 초보자를 위한 파이썬 200제, 정보문화사(2017)