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**
'SW' 카테고리의 다른 글
Tistory에 사용할 코드 구문 강조 방법 정리하기 (0) | 2022.11.27 |
---|---|
ESP-12 를 이용한 센서 연동 방법 조사 (0) | 2022.10.10 |
[SIMULINK] 코드 생성 시 Simulink Header가 생성이 안됨. (0) | 2022.02.11 |
[MATLAB] 명령 창에 마지막 줄에 프로그램/루프 상태 출력하기 (0) | 2021.12.09 |
[SW] 프로세스 스케쥴링 (0) | 2021.01.31 |