TCP에서 사용하는 소켓에 대해서 알아보자.
소켓은 전송계층과 응용계층을 이어주는 역할을 하며,
응용프로그램은 소켓을 통하여 통신망에 데이터를 송,수신 할 수가 있다.
네트워크는 서버와, 클라이언트가 연결된 상태로 구성되어있으며, 그 연결 과정으로는 다음과 같다
<연결과정>
1. (서버, 클라이언트)소켓 객체 생성
2. (서버) 호스트 및 포트 바인드
3. (서버) 클라이언트의 접속을 허용(listen)
4. (서버) accept : 클라이언트의 연결을 기다림, 클라이언트가 접속하면 소켓을 리턴한다
5. (클라이언트) connect : accept상태의 서버에 접속
<관련함수>
socket.sendall(data) : data를 연결된 소켓으로 전송한다
socket.recv(bufferSize) : 연결된 소켓으로부터 bufferSize만큼 데이터를 수신
소켓간의 데이터 송수신 과정에서는 data를 인코딩 과정을 거친 후 송신이 가능, 수신 후 디코딩을 해야한다.
소스를 보면서 살펴보자
server.py
import socket
#서버의 아이피 포트 정보
HOST = '127.0.0.1' #server ip. localhost. or 127.0.0.1
PORT = 9999 #server port 프로그램을 구분하는 유일한 번호
#서버 소켓을 오픈, 클라이언트를 받을 준비를 함, 큰 대문을 열어두는 것.
#server socket open. socket.AF_INET:주소체계(IPV4), socket.SOCK_STREAM:tcp
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#포트 여러번 바인드하면 발생하는 에러 방지 , 있어도 되고 없어도 된다.
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
#바인드:오픈한 소켓에 HOST와 PORT 할당
server_socket.bind((HOST, PORT))
#이제 클라이언트가 accept할 수 있음(접속 허용)
server_socket.listen()
print('server start')
#accept로 대기 : client의 접속을 기다리다 요청시 처리.
#client와 1:1통신할 소켓과 연결된 상대방의 주소 반환
client_socket, addr = server_socket.accept()
print('Connected by', addr)
while True:
data = client_socket.recv(1024) #recv(크기):소켓에서 1024 크기만큼 메시지를 읽음
msg = data.decode() #인코딩된 메시지를 디코드
print('Received from', addr, msg)
client_socket.sendall(data) # client로부터 받은 메시지 다시 전송
if msg=='/stop':
break
#소켓을 종료한다
client_socket.close()
server_socket.close()
client.py
import socket
HOST = '127.0.0.1'
PORT = 9999
#통신할 소켓 오픈
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#서버 accept()에 연결요청. server와 같은 host, 같은 port 이어야함
client_socket.connect((HOST, PORT))
while True:
msg = input('msg:')
client_socket.sendall(msg.encode()) #서버로 msg전송
data = client_socket.recv(1024) #서버로부터 데이터를 1024 크기만큼 수신
print('Received', data.decode())
if msg=='/stop':
break
client_socket.close()
<실행 결과>
server | client |
server start Connected by ('127.0.0.1', 57862) Received from ('127.0.0.1', 57862) 야이야이야 Received from ('127.0.0.1', 57862) 안녕하세요 Received from ('127.0.0.1', 57862) 잘가세요 |
msg:야이야이야 Received 야이야이야 msg:안녕하세요 Received 안녕하세요 msg:잘가세요 Received 잘가세요 |
실행 후 클라이언트에서 입력하면 메아리로 돌아오는 것을 확인 할 수 있다.
다음시간엔 쓰레드를 이용한 소켓통신을 알아보도록 하자
'프로그래밍 > 파이썬' 카테고리의 다른 글
GUI 멀티 채팅 프로그램 (TKinter, Thread, Socket) (1) | 2020.12.17 |
---|---|
TKinter 기본 (파이썬 GUI) (0) | 2020.12.17 |
제어문 - IF (0) | 2020.11.05 |
자료형과 연산자(파이썬) (0) | 2020.11.05 |
변수(파이썬) (1) | 2020.11.04 |
댓글