본문 바로가기
Server-Side Script/Python

python socket통신

by unkwn98 2021. 10. 20.

❄️ 파이썬으로 [ 소켓통신 ]하는 방법을 알아보자

- socket통신을 들어가기 전에...

1. client-server 사이 socket이 어떻게 전달되는지 미리 알아둬야 함

2. blocking과 non-blocking의 차이점을 알아야함

 

❄️ server.py [ server ]

import socket
import threading

"""
변수정의
"""
PORT = 9999
SERVER = ''
ADDR = (SERVER, PORT)
FORMAT = 'utf-8'
DISCONNECT_MESSAGE = "!DISCONNECT"

MAX_CONN = 10
BUFSIZE = 1024

server_socket = None

def ready():
  global server_socket
  server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  server_socket.bind((ADDR))
  server_socket.listen(MAX_CONN)

  if server_socket is not None:
    return True

# thread에서 실행되는 code
# 접속한 client마다 새로운 thread 생성, 통신
def threaded(conn, addr):
  print('[CONNECTED BY]:', addr[0], ':', addr[1])

  while True:
    try:
      data = conn.recv(BUFSIZE)
      if not data:
        print('[DISCONNECTED BY]: ' + addr[0], ':', addr[1])
        break
      else:
        print('[RECEIVED FROM]: ' + addr[0], ':', addr[1], data.decode(FORMAT))

      conn.send(data)

    except ConnectionResetError as e:
      print('[DISCONNECTED BY]: ' + addr[0], ':', addr[1])
      break

    except KeyboardInterrupt as e:
      print('keyboard interrupt')
      break

  conn.close()

# client가 접속 -> accept() 새로운 socket return
# 새로운 thread에서 해당 socket을 사용하여 통신
while True:
  if ready():
    conn, addr = server_socket.accept()
    t = threading.Thread(target=threaded, args=(conn, addr))
    t.daemon = True
    t.start()
  else:
    print('[SOCKET] CONNECTION ERROR')
    break

server_socket.close()

 

❄️ client.py [ client ]

import socket
import random
import time

SERVER = '127.0.0.1'
PORT = 9999
ADDR = (SERVER, PORT)

FORMAT = 'utf-8'
BUFSIZE = 1024

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((ADDR))

for i in range(10):
  rand_num = round(random.uniform(0, 50), 1)
  message = f"[RANDOM MESSAGE: ] {rand_num}"
  
  client_socket.send(message.encode())
  time.sleep(2)

client_socket.close()

====client에서 원하는 만큼 데이터를 보내고 테스트를 해봤다면 cmd/terminal에서 server process를 종료시켜주자.

windows는 taskkill -f /pid [ pid_no ]이다.

'Server-Side Script > Python' 카테고리의 다른 글

python 특별한 methods  (0) 2021.10.27
Django REST API 공식문서 요약본  (0) 2021.10.26
django db + migration  (0) 2021.09.30
django project 설정 / setup  (0) 2021.09.27
파이썬 인공지능 라이브러리  (2) 2021.08.31

댓글