IT강의/데이터통신

소켓 프로그래밍 기초 실습 - TCP편

샤핑 2020. 12. 26. 19:14
728x90
반응형

이번에는 소켓 프로그래밍을 TCP로 실습해보겠습니다.

 

우선 저번 포스팅에서 TCP의 특징을 언급했었는데, 기억 나시나요?? ㅎㅎ

저번 포스팅에서 언급했던 TCP를 살펴보면 다음과 같습니다.

 

TCP

- 신뢰적 전송(reliable transfer) 이므로 데이터 손실이 발생할 확률이 꽤 적습니다.

- 데이터 손실률이 매우 적은 대신, 속도가 느립니다.

- 서로 connection 되는 과정이 별도로 필요하며, 오로지 1:1 통신만 가능합니다.

 

 

이번 포스팅에서는 TCP 소켓을 이용해 통신하는 것을 기초적인 것만 실습해볼 것입니다.

실습하기 전, TCP 소켓으로 통신하는 과정을 살펴보면 다음과 같습니다.

 

 

우선, Client의 Flow에서 사용된 함수들을 살펴보면 아래와 같습니다.

 

socket() : 소켓을 생성함

connect() : IP주소와 포트번호를 이용해 서버한테 연결 요청(connection request)을 보냄

send() : 서버한테 메시지 또는 데이터를 전송함

recv() : 서버로부터 메시지 또는 데이터를 받음

close() : 서버와의 연결을 끊음 (disconnect)

 

다음, Server의 Flow에서 사용된 함수들만 살펴보겠습니다.

 

bind() : socket에 필요한 IP주소 정보를 할당함

listen() : 연결 요청을 받을 수 있도록 해줌

accept() : Client 로부터 들어온 연결 요청을 받음

 

 

소켓 프로그래밍 실습 - Python

※ 가독성을 높이기 위해 소스 코드도 일부러 이미지로 제시하였습니다. 소스 코드는 첨부파일에서 다운 받을 수 있습니다.

 

 

<TCP Client 소스 코드 (tcpclient.py)>

 

socket(AF_INET, SOCK_STREAM)

TCP 소켓을 생성합니다. 함수 두 번째 인자가 'SOCK_STREAM' 이므로 TCP 소켓입니다.

참고로,

  SOCK_STREAM: TCP 소켓

  SOCK_DGRAM: UDP 소켓

 

clientSocket.connect((serverName, serverPort))

Server한테 connection request를 보냅니다.

serverName이 'localhost' 이고 serverPort가 12000 이므로, IP주소와 포트번호는 다음과 같습니다.

 

IP주소: localhost (127.0.0.1)

포트번호: 12000

 

clientSocket.send( sentence.encode() )

send() 함수를 이용해 상대 측한테 메시지 또는 데이터를 전송하려면, Python 3.5의 경우 encoding(부호화) 작업이 필요합니다.

구체적으로 해석하자면, 'Client Message' 라는 문장을 byte 단위로 변환해준 다음 전송하는 것입니다.

 

※ decode(): encode() 와는 반대로, 다시 원문으로 복원해주는 함수입니다. (decoding)

 

clientSocket.recv(1024)

상대 측으로부터 메시지를 받는 함수인데, 좀 더 구체적으로 설명하자면,

최대 1024 bytes의 데이터 또는 메시지를 받겠다는 뜻입니다.

 

 

 

<TCP Server 소스 코드 (tcpserver.py)>

 

serverSocket.bind((' ', serverPort))

자신의 IP주소 'localhost' 와 포트번호 12000 이라는 정보로 소켓한테 할당해줍니다.

 

serverSocket.listen(1)

연결 요청을 받을 수 있도록 해주는 것인데, serverSocket을 listening socket으로 지정해주는 것입니다.

 

listening socket: 상대 측으로부터 connection request를 받아 다른 소켓한테 넘겨주는 역할만 하는 소켓

 

serverSocket.accept()

상대 측으로부터 connection request가 들어오면 수용한 다음 다른 소켓한테 넘겨줍니다.

이 후, 수용받은 소켓은 상대 측과 통신하기 위한 소켓이 되겠습니다.

 

 

결과 화면

 

 

<TCP Client>

Server가 'Server Message'를 전송하였으므로, Client 쪽에서 받아 그대로 출력하는 모습

 

 

<TCP Server>

Client가 'Client Message'를 전송하였으므로, Server 쪽에서 받아 그대로 출력하는 모습

Client, Server, 모두 정상적으로 잘 돌아가는 모습을 볼 수 있습니다.

 

 

tcpclient.py
0.00MB
tcpserver.py
0.00MB

 

 

<출처>

컴퓨터 네트워킹 하향식 접근 제6판, James F. Kurose.Keith W. Ross 지음, PEARSON

728x90
반응형
LIST