20253421 实验三《Python程序设计》实验报告
课程:《Python程序设计》
班级: 2534
姓名: 林资恒
学号:20253421
实验教师:王志强
实验日期:2026年4月25日
必修/选修: 公选课
1.实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求发送方输入内容,加密后并传输;接收方收到密文并解密和显示。要求:发方和收方同时输出明文和明文。
(3)程序代码托管到码云。
(4)添加文件操作
使用LLM生成一个带图形界面的程序
(1)分析关键代码的功能和使用方法
(2)分析生成程序的优点
(3)给出运行过程和结果截图
(4)程序代码托管到码云。
队友:20253318刘培德
2. 实验过程及结果
2.1 服务端代码


2.1 客户端代码

2.2 运行步骤
1.服务端程序运行
2.客户端程序运行
3.客户端输入文字,文字被转化为密文后发送
4.服务端收到密文和解密后的文字
2.3运行截图
我的队友(20253318刘培德)充当客户端

我充当服务端

我的队友(20253318)充当服务端

我充当客户端

会话内容已被添加进文件中


2.4 LLM生成的图形化的会话程序
LLM生成的服务端代码
import socket
import time
import tkinter as tk
from tkinter import scrolledtext, END, messagebox
加密函数:字符编码 +7
def jiami(data):
sa = ""
for c in data:
sa += chr(ord(c) + 7)
return sa
解密函数:字符编码 -7
def jiemi(data):
sa = ""
for c in data:
sa += chr(ord(c) - 7)
return sa
服务端 GUI 类
class ServerGUI:
def init(self, root):
self.root = root
self.root.title("加密聊天服务端 - 图形版")
self.root.geometry("650x550") # 窗口大小
变量
self.conn = None
self.addr = None
self.server_socket = None
聊天显示区域
self.chat_area = scrolledtext.ScrolledText(root, width=80, height=25, font=("微软雅黑", 10))
self.chat_area.pack(pady=10, padx=10)
self.chat_area.insert(END, "[系统] 等待启动服务...\n")
self.chat_area.config(state=tk.DISABLED) # 禁止手动编辑
输入框
self.input_frame = tk.Frame(root)
self.input_frame.pack(pady=5)
self.input_label = tk.Label(self.input_frame, text="输入消息:")
self.input_label.pack(side=tk.LEFT, padx=5)
self.input_entry = tk.Entry(self.input_frame, width=50, font=("微软雅黑", 12))
self.input_entry.pack(side=tk.LEFT)
self.input_entry.bind("
按钮
self.btn_frame = tk.Frame(root)
self.btn_frame.pack(pady=5)
self.start_btn = tk.Button(self.btn_frame, text="启动服务", command=self.start_server, bg="#4CAF50", fg="white")
self.start_btn.pack(side=tk.LEFT, padx=5)
self.send_btn = tk.Button(self.btn_frame, text="发送消息", command=self.send_message, bg="#2196F3", fg="white")
self.send_btn.pack(side=tk.LEFT, padx=5)
self.exit_btn = tk.Button(self.btn_frame, text="退出", command=self.exit_server, bg="#f44336", fg="white")
self.exit_btn.pack(side=tk.LEFT, padx=5)
追加消息到聊天框
def add_msg(self, msg):
self.chat_area.config(state=tk.NORMAL)
self.chat_area.insert(END, msg + "\n")
self.chat_area.see(END) # 自动滚动到底部
self.chat_area.config(state=tk.DISABLED)
启动服务
def start_server(self):
self.add_msg("[系统] 正在启动服务,端口:3421...")
try:
self.server_socket = socket.socket()
host = "0.0.0.0"
port = 3421
self.server_socket.bind((host, port))
self.server_socket.listen(1)
self.add_msg("[系统] 服务启动成功,等待客户端连接...")
异步等待连接(不卡顿界面)
self.root.after(100, self.wait_client)
except Exception as e:
self.add_msg(f"[错误] 启动失败:{str(e)}")
等待客户端连接
def wait_client(self):
try:
self.server_socket.settimeout(0.1)
self.conn, self.addr = self.server_socket.accept()
self.add_msg(f"[系统] 客户端连接成功:{self.addr}")
self.receive_loop() # 开始接收消息
except socket.timeout:
self.root.after(100, self.wait_client)
except Exception as e:
self.add_msg(f"[错误] 连接异常:{str(e)}")
循环接收消息
def receive_loop(self):
try:
data = self.conn.recv(1024)
if not data:
self.add_msg("[系统] 客户端断开连接")
return
str_data = data.decode()
text = jiemi(str_data)
self.add_msg("")
self.add_msg(f"[收到密文] {str_data}")
self.add_msg(f"[解密明文] {text}")
self.add_msg("")
写入日志
with open("log.txt", "a", encoding="utf-8") as f:
f.write(time.strftime("%Y-%m-%d %H:%M:%S") + "\n")
f.write(f"密文:{str_data}\n")
f.write(f"明文:{text}\n")
f.write("-" * 30 + "\n")
if text == "exit":
self.add_msg("[系统] 客户端主动退出")
self.conn.close()
return
继续接收
self.root.after(100, self.receive_loop)
except Exception as e:
self.add_msg(f"[错误] 接收消息失败:{str(e)}")
发送消息
def send_message(self, event=None):
if not self.conn:
messagebox.showwarning("提示", "未连接客户端!")
return
send_text = self.input_entry.get().strip()
if not send_text:
return
send_miwen = jiami(send_text)
try:
self.conn.send(send_miwen.encode())
self.add_msg(f"[发送明文] {send_text}")
self.add_msg(f"[发送密文] {send_miwen}")
self.input_entry.delete(0, END)
if send_text == "exit":
self.add_msg("[系统] 服务端主动退出")
self.conn.close()
self.server_socket.close()
self.root.quit()
except Exception as e:
self.add_msg(f"[错误] 发送失败:{str(e)}")
退出程序
def exit_server(self):
try:
if self.conn:
self.conn.close()
if self.server_socket:
self.server_socket.close()
except:
pass
self.root.quit()
运行 GUI
if name == "main":
main_root = tk.Tk()
app = ServerGUI(main_root)
main_root.mainloop()
LLM生成的客户端代码
import socket
import time
import tkinter as tk
from tkinter import scrolledtext, END, messagebox
加密解密 和服务端完全一致
def jiami(data):
sa = ""
for c in data:
sa += chr(ord(c) + 7)
return sa
def jiemi(data):
sa = ""
for c in data:
sa += chr(ord(c) - 7)
return sa
class ClientGUI:
def init(self, root):
self.root = root
self.root.title("加密聊天客户端 - 图形版")
self.root.geometry("650x550")
self.client_socket = None
self.is_connect = False
聊天显示区
self.chat_area = scrolledtext.ScrolledText(root, width=80, height=25, font=("微软雅黑",10))
self.chat_area.pack(pady=10, padx=10)
self.chat_area.insert(END, "[系统] 请先输入服务端IP,点击连接\n")
self.chat_area.config(state=tk.DISABLED)
IP输入行
self.ip_frame = tk.Frame(root)
self.ip_frame.pack(pady=3)
tk.Label(self.ip_frame, text="服务端IP:").pack(side=tk.LEFT,padx=5)
self.ip_entry = tk.Entry(self.ip_frame, width=30)
self.ip_entry.insert(END, "127.0.0.1") # 默认本地测试
self.ip_entry.pack(side=tk.LEFT)
输入消息框
self.input_frame = tk.Frame(root)
self.input_frame.pack(pady=5)
tk.Label(self.input_frame, text="消息:").pack(side=tk.LEFT,padx=5)
self.msg_entry = tk.Entry(self.input_frame, width=50, font=("微软雅黑",12))
self.msg_entry.pack(side=tk.LEFT)
self.msg_entry.bind("
按钮
self.btn_frame = tk.Frame(root)
self.btn_frame.pack(pady=5)
self.conn_btn = tk.Button(self.btn_frame, text="连接服务端", command=self.connect_server, bg="#4CAF50", fg="white")
self.conn_btn.pack(side=tk.LEFT,padx=5)
self.send_btn = tk.Button(self.btn_frame, text="发送消息", command=self.send_msg, bg="#2196F3", fg="white")
self.send_btn.pack(side=tk.LEFT,padx=5)
self.exit_btn = tk.Button(self.btn_frame, text="退出", command=self.quit_app, bg="#f44336", fg="white")
self.exit_btn.pack(side=tk.LEFT,padx=5)
def add_log(self, msg):
self.chat_area.config(state=tk.NORMAL)
self.chat_area.insert(END, msg+"\n")
self.chat_area.see(END)
self.chat_area.config(state=tk.DISABLED)
def connect_server(self):
if self.is_connect:
messagebox.showinfo("提示","已连接,无需重复连接")
return
ip = self.ip_entry.get().strip()
port = 3421
try:
self.client_socket = socket.socket()
self.client_socket.settimeout(5)
self.client_socket.connect((ip, port))
self.is_connect = True
self.add_log(f"[系统] 成功连接 {ip}:{port}")
# 开启接收循环
self.recv_loop()
except Exception as e:
self.add_log(f"[错误] 连接失败:{str(e)}")
def recv_loop(self):
try:
data = self.client_socket.recv(1024)
if not data:
self.add_log("[系统] 服务端已断开")
self.is_connect = False
return
miwen = data.decode()
mingwen = jiemi(miwen)
self.add_log("")
self.add_log(f"[收到密文] {miwen}")
self.add_log(f"[解密明文] {mingwen}")
self.add_log("")
if mingwen == "exit":
self.add_log("[系统] 服务端退出,连接断开")
self.is_connect = False
return
继续监听
self.root.after(100, self.recv_loop)
except:
self.is_connect = False
self.add_log("[系统] 连接异常断开")
def send_msg(self, event=None):
if not self.is_connect:
messagebox.showwarning("提示","请先连接服务端!")
return
text = self.msg_entry.get().strip()
if not text:
return
miwen = jiami(text)
try:
self.client_socket.send(miwen.encode())
self.add_log(f"[发送明文] {text}")
self.add_log(f"[发送密文] {miwen}")
self.msg_entry.delete(0, END)
if text == "exit":
self.add_log("[系统] 客户端退出")
self.client_socket.close()
self.is_connect = False
except:
self.add_log("[错误] 发送失败,连接已断开")
self.is_connect = False
def quit_app(self):
if self.client_socket:
try:
self.client_socket.close()
except:
pass
self.root.quit()
if name == "main":
root = tk.Tk()
app = ClientGUI(root)
root.mainloop()
LLM生成的程序中关键代码的作用:
1.代码用socket实现 TCP 通信,服务端监听、客户端连接。
2.jiami/jiemi通过字符编码 ±7 完成加解密。
3.Tkinter 则可以构建 GUI 界面,after异步接收消息避免卡顿,同时实现日志记录与异常处理,保证程序稳定运行。
LLM生成的程序的优点:
1.采用图形化的界面,使用更加方便,交互性得到很大的增强
2.代码健壮性十分地强,可以应对输入错误等
运行截图


2.5 代码托管至码云


3. 实验过程中遇到的问题和解决过程
- 问题1:开始时,我无法与我的队友的电脑连接
- 问题1解决方案:找到相关防火墙,调整与python相关的防火墙
- 问题2:AI给出的代码中有些小问题,比如客户端陷入死循环以及网页无法缩放
- 问题2解决方案:调整代码中的有关语句,使之能够顺畅运行,顺利显示页面来完成交流
其他(感悟、思考等)
经过了这次实验中我了解到python语言中有关socket的使用,实验的过程并不轻松,从密文规则的编写,port的设定以及ip地址的修改,每一步都需要我耐心地去找到相关方法并完成。
除此之外,一些电脑的设置以及代码的bug也引起了我对于程序的健壮性和简洁性的思考,在未来的学习中,我会更加重视这一点。
参考资料
《python编程:从入门到实践》
《Python 高级编程与工程实践》学习指导
...
浙公网安备 33010602011771号