본문 바로가기
프로그래밍/파이썬

파이썬 소켓(TCP)

by 의탕 2020. 12. 15.

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

댓글