관리 메뉴

FU11M00N

[ python ] socket 프로그래밍 - 다양한 데이터 보내기 (feat. pickle 직렬화) 본문

Programming/Python

[ python ] socket 프로그래밍 - 다양한 데이터 보내기 (feat. pickle 직렬화)

호IT 2021. 5. 28. 11:54

- mynetlib.py

import socket
import pickle
# =============================================================================
# 서버 코드
# =============================================================================
def run_server(port,do_work_server,s_count=1):
    # 1. 초기화
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 2. bind
    server.bind(('',port))
    
    # 3. listen
    server.listen(1)
    
    # 4. accept
    while s_count > 0:
        print('클라이언트 접속을 기다립니당나귀')
        client,addr = server.accept()
        
        do_work_server(client, addr)
        client.close()
        s_count-=1
        
    server.close()
# =============================================================================
# 클라이언트 코드
# =============================================================================
def run_client(ip,port,do_work_client):
    # 1. 초기화
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 2. connect
    print('서버에 접속을 시도중 !')
    client.connect((ip,port))
    print('서버 접속 완료!')
    do_work_client(client)
    
    client.close()
    print('접속 종료 *^^*')
    
# =============================================================================
# 공통 코드
# =============================================================================

def my_recv(B_SIZE,client):
    data = client.recv(B_SIZE)
    if not data:
        return data
    cmd = pickle.loads(data)
    return cmd

def my_send(cmd, client):
    data = pickle.dumps(cmd) # 직렬화
    client.sendall(data)
    
    return 0
    

mynetlib 은 서버가 통신할때 필요한 모듈과 클라이언트가 통신에 필요한 모듈을 작성한 코드입니다. 

 

run_server() 함수는  서버가 통신할때에 필요한 모듈입니다.

소켓프로그래밍에서 서버는  기본적으로 

1. 초기화
2. bind
3. listen
4. accept

순서를 지켜야합니다.

 

run_client() 함수는 클라이언트가 통신할때 필요한 모듈입니다.

클라이언트는 기본적으로

1. 초기화
2. connect

순서를 지켜야합니다.

 

 

my_recv() 함수와 my send() 함수는 데이터를 주고 받기위한 함수입니다.

my_send() 함수는 데이터를 보낼때 쓰이는 함수입니다. cmd 파라미터에 어떤 데이터가 올지 모르기에( 클래스 , 문자, 숫자, 리스트 등) pickle 모듈을 사용한것입니다.

my_recv() 함수는 데이터를 받을때 함수입니다.  

 

- server.py

import mynetlib

def do_work_server(client, addr):
    print('client :', addr)
    
    cmd_r = mynetlib.my_recv(1024, client)
    print(cmd_r[0], cmd_r[1])
    a = cmd_r[0]
    b = cmd_r[1]
    cmd_s = [a+b,a-b,a*b]
    mynetlib.my_send(cmd_s,client)
    
    
mynetlib.run_server(2023, do_work_server,1)

 

server.py 파일은 처음 서버가 실행되고 클라이언트와 연결을 기다리며 클라이언트측에서 보낸 데이터를 받아 연산하고 데이터를 돌려줍니다.

 

해당 코드에서는 list 데이터를 전송합니다.

 

- client.py

import mynetlib

def do_work_client(client):
    print('클라이언트 열일중')
    para1 = 77
    para2 = 23
    
    cmd = [para1,para2]
    
    mynetlib.my_send(cmd, client)
    
    cmd_r = mynetlib.my_recv(1024, client)
    
    print('+:',cmd_r[0],'\n-:',cmd_r[1],'\n*:',cmd_r[2])
    
    
mynetlib.run_client('localhost', 2023, do_work_client)

클라이언트 측은 서버에게 데이터를주는 역할을합니다.

Comments