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)