본문 바로가기
공부/파이썬 Python

Python의 간단한 UDP 채팅방 만들기

by 혼밥맨 2022. 6. 30.
반응형

Python의 간단한 UDP 채팅방 만들기

Simple UDP Chat Room in Python

 

UDP란

UDP는 User Datagram Protocol의 약자입니다.
TCP와는 다르게 데이터를 패킷으로 나누고 반대편에서 재조립하는 과정을 거치지 않으며 수신지에서 제대로 받던 받지 않던 상관안하고 데이터를 보내기만 합니다.
또 목적지에 도달하려고 하지만 (Best-effort) 에러가 날 수도 있고 재전송이나, 순서 뒤바뀜에 대한 대체는 어플리케이션에서 처리해 주어야 합니다.
그치만 속도가 빠릅니다 별도의 연결도 필요하지않고 ACK메시지를 통해서 확인을 받거나 하는것이 없기 때문에 TCP 프로토콜 보다는 더 빠른 속도를 낼수 있으며 이러한 빠른 속도로 UDP는 실시간 방송 등등등 사용을 하는데 데이터 처리가 신속하고 한 두장의 프레임이 빠저도 보정이 가능합니다.

 

TCP란

TCP는 Trasmission의 약자입니다.
데이터의 송수신을 위해 IP를 사용하는 프로토콜이며, TCP는 UDP의 비해서 복잡하지만 신뢰성이 높기 때문에 대부분 이 프로토콜을 사용한다고 보시면 됩니다.
TCP는 IP가 처리할 수 있도록 데이터를 여러 개의 패킷으로 나누고 도착지에서는 완전전한 데이터로 패킷들을 재조립 해야 합니다.
신뢰성이 있는것은 패킷의 분실이나 중복, 순서가 바뀌는 것 등의 문제를 해결해 주는 것입니다.

 

server.py

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
32
33
34
35
36
37
38
39
40
41
# server.py
 
import socket
import threading
import queue
 
messages = queue.Queue()
clients = []
 
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(("localhost"9999))
 
def receive():
    while True:
        try:
            message, addr = server.recvfrom(1024)
            messages.put((message, addr))
        except:
            pass
 
 
def broadcast():
    while True:
        while not messages.empty():
            message, addr = messages.get()
            print(message.decode())
            if addr not in clients:
                clients.append(addr)
            for client in clients:
                if message.decode().startswith("SIGNUP_TAG:"):
                    name = message.decode()[message.decode().index(":")+1:]
                    server.sendto(f"{name} joined!", client)
                else:
                    server.sendto(message)
 
 
t1 = threading.Thread(target=receive)
t2 = threading.Thread(target=broadcast)
 
t1.start()
t2.start()
cs

 

client.py

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
# client.py
 
import socket
import threading
import random
 
 
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.bind(("localhost", random.randint(80009000)))
 
name = input("Nickname: ")
 
def receive():
    while True:
        try:
            message, _ = client.recvfrom(1024)
            print(message.decode())
        except:
            pass
 
= threading.Thread(target=receive)
t.start()
 
client.sendto(f"SIGNUP_TAG:{name}".encode(), ("localhost"9999))
 
while True:
    message = input("")
    if message == "!q":
        exit()
    else:
        client.sendto(f"{name}: {message}".encode(), ("localhost"9999))
cs

 

실행방법

#01: server.py 실행

 

#02: sever.py를 실행한 CMD와 다른 CMD를 열어 client.py 실행 (Nickname: Mike)

#03: #02를 실행한 CMD와 다른 CMD를 열어 client.py 실행 (Nickname: Tom)

반응형

댓글