# 20251213 2025-2026-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 2512
姓名: 吴同心
学号:20251213
实验教师:王志强
实验日期:2026年4月27日
必修/选修: 公选课
1.实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
2. 实验过程及结果
要求1:
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
通信人:20251110孙益
我作为服务端:

我作为客户端:

(2)/(4)要求发送方输入内容,加密后并传输;接收方收到密文并解密和显示。要求:发方和收方同时输出明文和明文。
运行结果:
文件:
(3)代码托管到Gitee

2:使用LLM生成一个带图形界面的程序
(1)分析关键代码的功能和使用方法
代码:①服务端:
import socket
import threading
import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox
class TCPServer:
def init(self, root):
self.root = root
self.root.title("TCP 服务端")
self.root.geometry("600x500")
变量
self.port = tk.StringVar(value="8888")
self.server_socket = None
self.clients = [] # 保存所有客户端连接
self.is_running = False
界面
self.setup_ui()
def setup_ui(self):
# 顶部控制面板
control_frame = ttk.Frame(self.root)
control_frame.pack(pady=10, fill=tk.X)
ttk.Label(control_frame, text="端口:").grid(row=0, column=0, padx=5)
ttk.Entry(control_frame, textvariable=self.port, width=10).grid(row=0, column=1, padx=5)
self.start_btn = ttk.Button(control_frame, text="启动服务", command=self.start_server)
self.start_btn.grid(row=0, column=2, padx=5)
ttk.Button(control_frame, text="停止服务", command=self.stop_server).grid(row=0, column=3, padx=5)
日志显示区域
ttk.Label(self.root, text="服务日志:").pack()
self.log_text = scrolledtext.ScrolledText(self.root, width=70, height=25)
self.log_text.pack(padx=10, pady=5, fill=tk.BOTH, expand=True)
def log(self, msg):
# 日志输出
self.log_text.insert(tk.END, msg + "\n")
self.log_text.see(tk.END)
def start_server(self):
if self.is_running:
messagebox.showwarning("提示", "服务已启动")
return
try:
port = int(self.port.get())
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server_socket.bind(("0.0.0.0", port))
self.server_socket.listen(5)
self.is_running = True
self.log(f"✅ 服务已启动,监听端口:{port}")
开启线程监听客户端
threading.Thread(target=self.accept_clients, daemon=True).start()
except Exception as e:
messagebox.showerror("错误", f"启动失败:{str(e)}")
def accept_clients(self):
while self.is_running:
try:
client_socket, addr = self.server_socket.accept()
self.clients.append(client_socket)
self.log(f"📥 新客户端连接:{addr}")
# 开启线程处理客户端消息
threading.Thread(target=self.handle_client, args=(client_socket, addr), daemon=True).start()
except:
break
def handle_client(self, client_socket, addr):
while self.is_running:
try:
data = client_socket.recv(1024).decode("utf-8")
if not data:
break
msg = f"[{addr[0]}:{addr[1]}] {data}"
self.log(msg)
# 广播消息给所有客户端
self.broadcast(msg, client_socket)
except:
break
客户端断开
self.log(f"❌ 客户端断开:{addr}")
if client_socket in self.clients:
self.clients.remove(client_socket)
client_socket.close()
def broadcast(self, msg, exclude_socket=None):
# 转发给所有客户端
for client in self.clients:
if client != exclude_socket:
try:
client.send(msg.encode("utf-8"))
except:
self.clients.remove(client)
def stop_server(self):
if not self.is_running:
messagebox.showwarning("提示", "服务未启动")
return
self.is_running = False
# 关闭所有客户端
for client in self.clients:
try:
client.close()
except:
pass
self.clients.clear()
if self.server_socket:
self.server_socket.close()
self.log("🛑 服务已停止")
if name == "main":
root = tk.Tk()
app = TCPServer(root)
root.mainloop()
②客户端:
import socket
import threading
import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox
class TCPClient:
def init(self, root):
self.root = root
self.root.title("TCP 客户端")
self.root.geometry("600x500")
变量
self.ip = tk.StringVar(value="127.0.0.1")
self.port = tk.StringVar(value="8888")
self.send_msg = tk.StringVar()
self.client_socket = None
self.is_connected = False
界面
self.setup_ui()
def setup_ui(self):
# 连接面板
conn_frame = ttk.Frame(self.root)
conn_frame.pack(pady=10, fill=tk.X)
ttk.Label(conn_frame, text="服务器IP:").grid(row=0, column=0, padx=5)
ttk.Entry(conn_frame, textvariable=self.ip, width=15).grid(row=0, column=1, padx=5)
ttk.Label(conn_frame, text="端口:").grid(row=0, column=2, padx=5)
ttk.Entry(conn_frame, textvariable=self.port, width=10).grid(row=0, column=3, padx=5)
self.conn_btn = ttk.Button(conn_frame, text="连接", command=self.connect_server)
self.conn_btn.grid(row=0, column=4, padx=5)
ttk.Button(conn_frame, text="断开", command=self.disconnect).grid(row=0, column=5, padx=5)
聊天记录
ttk.Label(self.root, text="聊天记录:").pack()
self.chat_text = scrolledtext.ScrolledText(self.root, width=70, height=20)
self.chat_text.pack(padx=10, pady=5, fill=tk.BOTH, expand=True)
发送面板
send_frame = ttk.Frame(self.root)
send_frame.pack(pady=5, fill=tk.X)
ttk.Entry(send_frame, textvariable=self.send_msg, width=50).pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True)
ttk.Button(send_frame, text="发送", command=self.send_message).pack(side=tk.RIGHT, padx=5)
def log(self, msg):
self.chat_text.insert(tk.END, msg + "\n")
self.chat_text.see(tk.END)
def connect_server(self):
if self.is_connected:
messagebox.showwarning("提示", "已连接")
return
try:
ip = self.ip.get()
port = int(self.port.get())
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client_socket.connect((ip, port))
self.is_connected = True
self.log("✅ 已连接到服务器")
开启线程接收消息
threading.Thread(target=self.receive_msg, daemon=True).start()
except Exception as e:
messagebox.showerror("错误", f"连接失败:{str(e)}")
def receive_msg(self):
while self.is_connected:
try:
data = self.client_socket.recv(1024).decode("utf-8")
if data:
self.log(data)
except:
self.log("❌ 与服务器断开连接")
self.is_connected = False
break
def send_message(self):
if not self.is_connected:
messagebox.showwarning("提示", "未连接服务器")
return
msg = self.send_msg.get().strip()
if not msg:
return
try:
self.client_socket.send(msg.encode("utf-8"))
self.log(f"[我] {msg}")
self.send_msg.set("")
except:
self.log("❌ 发送失败")
def disconnect(self):
if not self.is_connected:
messagebox.showwarning("提示", "未连接")
return
self.is_connected = False
if self.client_socket:
self.client_socket.close()
self.log("🛑 已断开连接")
if name == "main":
root = tk.Tk()
app = TCPClient(root)
root.mainloop()
使用方法:
①先运行Server.py,点击“启动服务”,服务器启用
②然后运行一个或多个Client.py,点击“连接”,就可以开始聊天了,此时任意客户端发送消息,服务端会自动转发给所有其他客户端
③最后分别点击断开,客户端和服务器终止
(2)分析生成程序的优点:
①界面简洁
②操作方便
③支持多个客户端相互发送信息,功能多样
(3)运行过程与结果:


(4)程序代码托管到码云。

3. 实验过程中遇到的问题和解决过程
- 问题1:反复连不上对方的服务器
- 问题1解决方案:改用个人热点实现连接
其他(感悟、思考等)
python真奇妙

浙公网安备 33010602011771号