반응형

python의 socket 패키지를 이용하여 UDP 통신을 구현하고 테스트해본다.

 

socket 함수 요약

1. 소켓 생성 socket_obj = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)

 

서버 소켓 server_socket_obj = socket.socket(-)

2. 서버 소켓 생성 server_socket_obj.bind((IP_STRING, PORT_NUMBER))

3. 서버 소켓 BLOCKING 설정 server_socket_obj.setblocking(TRUE/FALSE)

4. 서버 소켓 timeout 설정 server_socket_obj.settimeout(TIMEOUT_SEC)

5. 서버 소켓에서 메시지 수신 bytes_addr_pair = server_socket_obj.recvfrom(BUFFER_SIZE)

 

클라이언트 소켓 client_socket_obj = socket.socket(-)

6. 서버 소켓으로 bytes 배열 메시지 보내기 client_socket_obj.sendto(BYTES_TO_SEND, (IP_STRING, PORT_NUMBER))

 

Note.

서버 소켓을 Non-blocking으로 설정했다면 blocking IO 예외처리를 해주어야한다.

1
2
3
4
5
6
7
udp_server_socket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
udp_server_socket.bind((SERVER_IP, SERVER_PORT))
udp_server_socket.setblocking(False# True : Blocking, False : Non-blocking
try:
  byte_addr_pair = udp_server_socket.recvfrom(BUFFER_SIZE)
except BlockingIOError:
  continue
cs

서버 소켓에 timeout을 설정했다면, timeout 예외처리를 해주어야한다.

1
2
3
4
5
6
7
udp_server_socket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
udp_server_socket.bind((SERVER_IP, SERVER_PORT))
udp_server_socket.settimeout(TIMEOUT_SEC)
try:
  byte_addr_pair = udp_server_socket.recvfrom(BUFFER_SIZE)
except socket.timeout:
  continue
cs

 

사용 예시 - Server/Client

서버는 서버의 IP/PORT를 고정하고 메시지 수신 대기 중이며, 메시지가 오면 해석해서 출력한다.

클라이언트는 서버의 IP/PORT에 메시지를 보내고 종료된다.

 

Server 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import socket
 
# 클라이언트가 보내고자 하는 서버의 IP와 PORT
server_ip = "127.0.0.1"
server_port = 3000
server_addr_port = (server_ip, server_port)
buffersize = 1024
 
# 소켓을 UDP로 열고 서버의 IP/PORT를 연결한다. 그리고 Non-blocking로 바꾼다.
udp_server_socket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
udp_server_socket.bind(server_addr_port)
udp_server_socket.setblocking(False)
# udp_server_socket.settimeout(1.0)
 
print("UDP server is up and listening")
 
# Listen Datagram incoming
while(True):
  try:
    byte_addr_pair = udp_server_socket.recvfrom(buffersize)
  except BlockingIOError:
    continue
  msg  = byte_addr_pair[0]
  addr = byte_addr_pair[1]
 
  client_msg = "msg from client : {}".format(len(msg))
  client_ip  = "client IP Addr : {}".format(addr)
 
  print(client_msg)
  print(client_ip)
  print(msg)
cs

 

Client 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import socket
 
# 클라이언트가 보내고자 하는 서버의 IP와 PORT
server_ip = "127.0.0.1"
server_port = 3000
server_addr_port = (server_ip, server_port)
 
# 보낼 메시지를 byte 배열로 바꾼다.
msg_from_client = "Hello Server from client"
bytes_to_send = str.encode(msg_from_client)
 
# 소켓을 UDP로 열고 서버의 IP/PORT로 메시지를 보낸다.
udp_client_socket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
udp_client_socket.sendto(bytes_to_send, server_addr_port)
cs

 

**EOF**

728x90

+ Recent posts