---
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()
```