Skip to content

Instantly share code, notes, and snippets.

@ninenine
Created May 1, 2024 20:37
Show Gist options
  • Save ninenine/df08c6ca7863003700e70c15b080db83 to your computer and use it in GitHub Desktop.
Save ninenine/df08c6ca7863003700e70c15b080db83 to your computer and use it in GitHub Desktop.
UDP chat in python
import socket
import threading
from typing import List, Tuple
class ChatApp:
def __init__(self, port: int = 5555):
self.clients: List[Tuple[str, int]] = [] # Store client addresses
self.client_socket: socket.socket = None
self.server_socket: socket.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server_socket.bind(('0.0.0.0', port))
def start_server(self) -> None:
print(f"Server started on port {self.server_socket.getsockname()[1]}")
receive_thread = threading.Thread(target=self.receive_messages, daemon=True)
receive_thread.start()
def receive_messages(self) -> None:
while True:
data, client_address = self.server_socket.recvfrom(1024)
message = f"{client_address}: {data.decode()}"
print(message)
self.broadcast(message, client_address)
def broadcast(self, message: str, sender_address: Tuple[str, int]) -> None:
for client_address in self.clients:
if client_address != sender_address:
self.server_socket.sendto(message.encode(), client_address)
def start_client(self) -> None:
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
receive_thread = threading.Thread(target=self.receive_messages, daemon=True)
receive_thread.start()
self.send_messages()
def send_messages(self) -> None:
while True:
try:
message = input("> ")
self.client_socket.sendto(message.encode(), ('<broadcast>', 5555))
except Exception as e:
print(f"Error sending message: {e}")
break
if __name__ == "__main__":
app = ChatApp()
server_thread = threading.Thread(target=app.start_server, daemon=True)
server_thread.start()
app.start_client()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment