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)
클라이언트 측은 서버에게 데이터를주는 역할을합니다.