--- tags: Python系統設計 --- 新增時間:20241022 更新時間:20241022 # 聊天室 ## server端 ``` # -*- coding: utf-8 -*- import socket import os import datetime def start_server(host='0.0.0.0', port=12345): server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_socket.bind((host, port)) print(f'Server started at {host}:{port}') log_folder = r'C:\Genesis' if not os.path.exists(log_folder): os.makedirs(log_folder) clients = set() # ノ癘魁┮Τ硈钡め狠 while True: data, addr = server_socket.recvfrom(1024) message = data.decode() # 癘魁め狠 clients.add(addr) try: username, chat_message = message.split(': ', 1) # 浪琩ノめ㎝琌 if not username.strip() or not chat_message.strip(): print("Received an empty message, ignoring.") continue now = datetime.datetime.now() log_filename = os.path.join(log_folder, f'chat_log_{now.strftime("%Y%m%d")}.txt') # 盢册ぱず甧糶ら粁ゅン with open(log_filename, 'a') as log_file: log_file.write(f'{now.strftime("%Y-%m-%d %H:%M:%S")} - {addr[0]} - {username}: {chat_message}\n') # 約冀癟倒┮Τめ狠 broadcast_message = f'{now.strftime("%Y-%m-%d %H:%M:%S")} - {addr[0]} - {username}: {chat_message}' for client in list(clients): # ㄏノ list() 磷筁祘いэ栋 try: server_socket.sendto(broadcast_message.encode(), client) except Exception as e: print(f"Error sending message to {client}: {e}") clients.remove(client) # 簿埃アめ狠 except ValueError: # 矪瞶Α岿粇 error_message = "Error: Message format is incorrect. Use 'username: message'" server_socket.sendto(error_message.encode(), addr) if __name__ == '__main__': start_server() ``` ## client端 ``` # -*- coding: utf-8 -*- import socket import threading def listen_for_messages(client_socket): print(f"client_socket: {client_socket}, valid: {isinstance(client_socket, socket.socket)}") if not isinstance(client_socket, socket.socket): print("Error: client_socket is not a valid socket.") return while True: try: message, _ = client_socket.recvfrom(1024) print(message.decode()) except BlockingIOError: # 獶峨家Α?Τ?誹钡Μ continue except Exception as e: print(f"Error receiving message: {e}") break def start_client(host='GenesisOfDestiny.asuscomm.com', port=12345): # ㄏノ狝竟呼 client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) client_socket.setblocking(False) # ??獶峨家Α client_socket.bind(('0.0.0.0', port)) # ?﹚セ┮Τノ username = input("Enter your username: ") # ????祘?钡Μ threading.Thread(target=listen_for_messages, args=(client_socket,), daemon=True).start() while True: message = input(f"{username}: ") if message.lower() == 'exit': break full_message = f"{username}: {message}" client_socket.sendto(full_message.encode(), (host, port)) client_socket.close() if __name__ == '__main__': start_client() ```