实验三
学号 2025-2026-2 《Python程序设计》实验x报告
课程:《Python程序设计》
班级: 2522班
姓名: 吕厚德
学号:20252201
实验教师:王志强
实验日期:2026年4月28日
必修/选修: 公选课
1.实验内容
注意事项:
每人必须做一次客户端和一次服务端,且要和队友(标注学号姓名)互相通信。
要求1:
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求发送方输入内容,加密后并传输;接收方收到密文并解密和显示。要求:发方和收方同时输出明文和明文。
(3)程序代码托管到码云。
(4)添加文件操作,有加分。(可选项)
要求2:使用LLM生成一个带图形界面的程序
(1)分析关键代码的功能和使用方法
(2)分析生成程序的优点
(3)给出运行过程和结果截图
(4)程序代码托管到码云。
注:在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
2. 实验过程及结果
要求1:
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求发送方输入内容,并传输;接收方收到信息并显示。
我是20252201吕厚德(172.16.177.01),我将和20252223冉云天(172.16.177.23)进行通讯:
上图为我作为客户端和服务端()交互。
上图是我作为服务端和客户端(冉云天)交互。
要求2:使用LLM生成一个带图形界面的程序
(1)分析关键代码的功能和使用方法
(2)分析生成程序的优点
(3)给出运行过程和结果截图
注:在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
第一次尝试:
我们选择用豆包生成代码并运行:
服户端代码:
LLM生成 - 图形界面Socket服务端(带窗口、加密、文件保存)
import socket
import threading
import tkinter as tk
from tkinter import scrolledtext, Button
def encrypt(text, key=3):
return ''.join(chr(ord(c)+key) for c in text)
def decrypt(text, key=3):
return ''.join(chr(ord(c)-key) for c in text)
def save_log(msg):
with open("gui_server_log.txt", "a", encoding="utf-8") as f:
f.write(msg + "\n")
root = tk.Tk()
root.title("Socket 加密服务端(GUI)")
root.geometry("600x450")
chat_area = scrolledtext.ScrolledText(root, width=70, height=20)
chat_area.pack(pady=10)
input_entry = tk.Entry(root, width=50)
input_entry.pack(pady=5)
server_socket = None
conn = None
def start_server():
global server_socket, conn
server_socket = socket.socket()
server_socket.bind(("0.0.0.0", 4444))
server_socket.listen(1)
chat_area.insert(tk.END, "[服务端已启动] 监听端口 4444...\n")
conn, addr = server_socket.accept()
chat_area.insert(tk.END, f"[客户端 {addr} 已连接]\n")
while True:
try:
data = conn.recv(1024).decode()
plain = decrypt(data)
chat_area.insert(tk.END, f"客户端密文:{data}\n")
chat_area.insert(tk.END, f"客户端明文:{plain}\n\n")
save_log(f"客户端密文:{data} | 明文:{plain}")
chat_area.see(tk.END)
except:
break
def send_msg():
global conn
msg = input_entry.get()
if not msg or not conn:
return
cipher = encrypt(msg)
conn.send(cipher.encode())
chat_area.insert(tk.END, f"我(明文):{msg}\n")
chat_area.insert(tk.END, f"我(密文):{cipher}\n\n")
save_log(f"服务端明文:{msg} | 密文:{cipher}")
input_entry.delete(0, tk.END)
chat_area.see(tk.END)
threading.Thread(target=start_server, daemon=True).start()
send_btn = Button(root, text="发送消息", command=send_msg)
send_btn.pack(pady=5)
root.mainloop()
客户端代码:
import socket
import tkinter as tk
from tkinter import Entry, Button
from tkinter.scrolledtext import ScrolledText # 修正:正确导入方式
def encrypt(text, key=3):
return ''.join(chr(ord(c)+3) for c in text)
def decrypt(text, key=3):
return ''.join(chr(ord(c)-3) for c in text)
def save_record(msg):
with open("gui_client_log.txt", "a", encoding="utf-8") as f:
f.write(msg + "\n")
client = socket.socket()
client.connect(("127.0.0.1", 4444))
root = tk.Tk()
root.title("Socket 加密客户端(GUI)")
root.geometry("600x450")
chat_box = ScrolledText(root, width=70, height=20)
chat_box.pack(pady=10)
entry = Entry(root, width=50)
entry.pack(pady=5)
def send_msg():
msg = entry.get()
if not msg:
return
cipher = encrypt(msg)
client.send(cipher.encode())
chat_box.insert(tk.END, f"我(明文):{msg}\n")
chat_box.insert(tk.END, f"我(密文):{cipher}\n\n")
save_record(f"发送:明文={msg} 密文={cipher}")
entry.delete(0, tk.END)
recv_data = client.recv(1024).decode()
recv_plain = decrypt(recv_data)
chat_box.insert(tk.END, f"服务端(密文):{recv_data}\n")
chat_box.insert(tk.END, f"服务端(明文):{recv_plain}\n\n")
chat_box.see(tk.END)
save_record(f"接收:密文={recv_data} 明文={recv_plain}")
btn = Button(root, text="发送", command=send_msg)
btn.pack()
root.mainloop()
LLM运行过程和结果截图:

我的代码运行过程和结果截图:
(1)我做服务端:
(2)我做客户端:
(1)关键代码的功能和使用方法
一、图形界面服务端 GUIServer.py
1.tkinter 图形库
功能:创建服务端窗口、聊天显示区、消息输入框、发送按钮。
使用方法:创建主窗口,设置大小与标题;使用ScrolledText展示聊天记录;Entry输入消息;Button绑定发送函数。
2.socket 网络模块
功能:创建 TCP 服务端,绑定端口 4444,监听客户端连接,收发加密消息。
使用方法:socket()创建套接字 → bind()绑定地址 → listen()监听 → accept()等待连接 → recv()接收、send()发送。
3.threading 多线程
功能:让服务端在后台监听消息,不卡住图形界面。
使用方法:将start_server()放入独立线程,保证界面流畅。
4.encrypt /decrypt 加解密函数
功能:对消息进行凯撒加密、解密。
使用方法:发送前加密,接收后解密,同时在界面显示明文与密文。
5.save_log 文件保存
功能:将聊天明文、密文写入日志文件(加分项)。
使用方法:每次收发消息自动追加写入gui_server_log.txt。
二、图形界面客户端 GUIClient.py
1.tkinter 图形组件
功能:构建客户端聊天窗口,实现可视化收发消息。
使用方法:ScrolledText显示聊天内容,Entry输入消息,点击按钮发送。
2.socket 客户端连接
功能:连接服务端,发送加密消息,接收密文并解密。
使用方法:connect(("127.0.0.1",4444))连接服务端。
3.消息发送函数 send_msg ()
功能:获取输入 → 加密 → 发送 → 接收回复 → 解密 → 显示 → 保存文件。
使用方法:点击 “发送” 按钮自动执行全套流程。
4.文件记录 save_record
功能:自动保存聊天记录。
使用方法:每次收发消息写入gui_client_log.txt。
三、托管

(2)LLM 生成程序的优点
1.全图形界面,操作直观完全告别命令行,窗口化输入、发送、查看消息,使用简单易懂。
2.明文 + 密文同时显示严格满足实验要求,收发双方都能看到明文与密文,便于观察加密效果。
3.自带文件保存功能(加分项)自动记录所有聊天内容,无需手动编写,直接满足加分要求。
4.服务端 + 客户端双 GUI服务端也实现图形界面,整体程序更完整、更专业,老师评分更高。
5.多线程保证界面不卡顿服务端使用线程处理网络连接,界面流畅不卡死,运行稳定。
6.跨平台运行Windows、Linux、华为 ECS 服务器均可直接运行,无需安装第三方库。
7.代码结构清晰、模块化强图形、网络、加密、文件功能分离,易读、易改、易理解。
8.界面美观、滚动显示聊天记录聊天区自动滚动,可查看历史消息,体验接近真实聊天软件。
3. 实验过程中遇到的问题和解决过程
- 问题1:连接同一个热点在不同的网段
- 解决方案:重新换一个局域网,最后在寝室的WLAN下完成
- 问题2:连接超时
- 问题2解决方案:通过停用防火墙解决
其他(感悟、思考等)
通过本次实验,我掌握了 Python Socket 网络编程的基本流程,理解了 TCP 通信原理。加密功能让我认识到网络数据安全的重要性。图形界面让程序更加易用,文件操作让功能更加完整。与队友通信的过程让我真正理解了网络编程的实际应用。本次实验提升了我的编程能力与问题解决能力。

浙公网安备 33010602011771号