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 服务端代码
image
image
2.1 客户端代码
image
2.2 运行步骤
1.服务端程序运行
2.客户端程序运行
3.客户端输入文字,文字被转化为密文后发送
4.服务端收到密文和解密后的文字
2.3运行截图
我的队友(20253318刘培德)充当客户端
屏幕截图 2026-05-01 221613

我充当服务端
屏幕截图 2026-05-01 221522

我的队友(20253318)充当服务端
屏幕截图 2026-05-01 210752
我充当客户端
image
会话内容已被添加进文件中
image
image
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.send_message) # 回车发送

按钮

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.send_msg)

按钮

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.代码健壮性十分地强,可以应对输入错误等
运行截图
屏幕截图 2026-05-06 110135
屏幕截图 2026-05-06 110147
2.5 代码托管至码云
image
屏幕截图 2026-05-06 111611

3. 实验过程中遇到的问题和解决过程

  • 问题1:开始时,我无法与我的队友的电脑连接
  • 问题1解决方案:找到相关防火墙,调整与python相关的防火墙
  • 问题2:AI给出的代码中有些小问题,比如客户端陷入死循环以及网页无法缩放
  • 问题2解决方案:调整代码中的有关语句,使之能够顺畅运行,顺利显示页面来完成交流

其他(感悟、思考等)

经过了这次实验中我了解到python语言中有关socket的使用,实验的过程并不轻松,从密文规则的编写,port的设定以及ip地址的修改,每一步都需要我耐心地去找到相关方法并完成。
除此之外,一些电脑的设置以及代码的bug也引起了我对于程序的健壮性和简洁性的思考,在未来的学习中,我会更加重视这一点。

参考资料

《python编程:从入门到实践》

《Python 高级编程与工程实践》学习指导

...

posted @ 2026-05-06 11:26  Drunkdy  阅读(10)  评论(1)    收藏  举报