20253331靳淏童《Python程序设计》实验三报告
20253302 2025-2026-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级:2533
姓名:靳淏童
学号:20253331
实验教师:王志强
实验日期:2026年4月27日
必修/选修:公选课
1.实验内容
此处填写实验的具体内容;
要求1:
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
(4)程序代码托管到码云。
要求2:使用LLM生成一个带图形界面的程序
(1)分析关键代码的功能和使用方法
(2)分析生成程序的优点
(3)给出运行过程和结果截图
(4)程序代码托管到码云。
- 实验过程及结果
老师的代码
服务端程序
import socket #pip install socket
创建TCP Socket对象
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
办电话卡,叫127
HOST = "192.168.43.2" #"localhost"
PORT = 3302
把电话卡插到手机上
server.bind((HOST, PORT))
server.listen(1)#最多1进程,1个人同时打电话
print("服务器。启动!等待客户连接。。。。")
while True:
conn, addr = server.accept()
print(f"已经连接好客户端:{addr}")
接收消息
while True:
data = conn.recv(1024).decode("utf-8")
if not data: # 客户端断开
print("客户端断开连接")
break
写到文件里
with open("rec.txt", "a", encoding="utf-8") as f:
f.write("客户端: " + data + "\n")
print(f"客户端的密文是:{data.encode("utf-8")}")
print(f"客户端:{data}")
send_msg=input("我:")
conn.send(send_msg.encode("utf-8"))
print(f"你输入的密文是:{send_msg.encode("utf-8")}")
记录发出的消息
with open("rec.txt", "a", encoding="utf-8") as f:
f.write("我: " + send_msg + "\n")
conn.close()
server.close()
客户端程序
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
TCP
HOST = "192.168.43.12"
PORT = 3312
client.connect((HOST, PORT))
print("已连接服务!输入 exit 退出")
while True:
# 发送数据
send_msg = input("我:")
client.send(send_msg.encode("utf-8"))
print(f"密文是{send_msg.encode("utf-8")}")
将发送的消息写入
with open("sent.txt", "a", encoding="utf-8") as f:
f.write("我: " + send_msg + "\n")
if send_msg.lower() == "exit":
print("客户端断开")
break
接收数据
data = client.recv(1024).decode("utf-8")
if not data:
break
将接收到的消息写入
with open("sent.txt", "a", encoding="utf-8") as f:
f.write("服务端: " + data + "\n")
print(f"服务端给的密文是:{data.encode("utf-8")}")
print(f"服务端说:{data}")
client.close()
服务端代码
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
HOST = "127.0.0.1"
PORT = 8888
server.bind((HOST, PORT))
server.listen(5)
print(f"服务端已启动,监听 {HOST}:{PORT},等待客户端连接...")
conn, addr = server.accept()
print(f"已连接客户端:{addr}")
while True:
# 1. 接收客户端消息
data = conn.recv(1024).decode("utf-8")
if not data or data == "exit":
print("客户端已断开或输入 exit,退出聊天。")
break
print(f"\n客户端:{data}")
2. 发送服务端回复
send_msg = input("我:")
conn.send(send_msg.encode("utf-8"))
if send_msg == "exit":
print("服务端退出聊天。")
break
conn.close()
server.close()
python
在此粘贴您的服务端代码
客户端代码
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("127.0.0.1", 8888))
client.send("Hello from client".encode("utf-8"))
data = client.recv(1024).decode("utf-8")
print(f"服务端回复:{data}")
client.close()
python

2.2 LLM生成图形界面程序
(1)关键代码功能及使用方法
(分析AI生成代码的核心部分:如加密函数、界面布局、多线程接收等,并说明如何运行)
import socket
import threading
import tkinter as tk
from tkinter import scrolledtext, messagebox
def xor_crypt(data, key="secret"):
return ''.join(chr(ord(c) ^ ord(key[i % len(key)])) for i, c in enumerate(data))
class ChatServer:
def init(self):
self.window = tk.Tk()
self.window.title("加密聊天室 - 服务端")
self.window.geometry("500x600")
网络配置
tk.Label(self.window, text="服务端IP:").pack(pady=5)
self.ip_entry = tk.Entry(self.window, width=20)
self.ip_entry.insert(0, "192.168.56.1")
self.ip_entry.pack()
tk.Label(self.window, text="端口:").pack(pady=5)
self.port_entry = tk.Entry(self.window, width=20)
self.port_entry.insert(0, "3302")
self.port_entry.pack()
self.start_btn = tk.Button(self.window, text="启动服务", command=self.start_server)
self.start_btn.pack(pady=10)
聊天记录区域
self.text_area = scrolledtext.ScrolledText(self.window, width=60, height=25, state='disabled')
self.text_area.pack(pady=10, padx=10)
# 配置标签样式(必须在创建 text_area 之后)
self.text_area.tag_configure('cipher', foreground='gray')
self.text_area.tag_configure('plain', foreground='blue')
输入区域
self.input_frame = tk.Frame(self.window)
self.input_frame.pack(pady=5)
self.msg_entry = tk.Entry(self.input_frame, width=40)
self.msg_entry.pack(side=tk.LEFT, padx=5)
self.send_btn = tk.Button(self.input_frame, text="发送", command=self.send_message, state='disabled')
self.send_btn.pack(side=tk.LEFT)
self.server = None
self.client_socket = None
self.running = False
self.receive_thread = None
self.window.protocol("WM_DELETE_WINDOW", self.on_closing)
self.window.mainloop()
def append_text(self, msg, tag=None):
self.text_area.config(state='normal')
self.text_area.insert(tk.END, msg + "\n", tag)
self.text_area.see(tk.END)
self.text_area.config(state='disabled')
def start_server(self):
host = self.ip_entry.get()
port = int(self.port_entry.get())
try:
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.bind((host, port))
self.server.listen(1)
self.append_text(f"[系统] 服务已启动,监听 {host}:{port}")
self.start_btn.config(state='disabled')
threading.Thread(target=self.accept_client, daemon=True).start()
except Exception as e:
messagebox.showerror("错误", f"启动失败: {e}")
def accept_client(self):
try:
self.client_socket, addr = self.server.accept()
self.append_text(f"[系统] 客户端 {addr} 已连接")
self.send_btn.config(state='normal')
self.running = True
self.receive_thread = threading.Thread(target=self.receive_messages, daemon=True)
self.receive_thread.start()
except Exception as e:
self.append_text(f"[错误] 接受连接失败: {e}")
def receive_messages(self):
while self.running and self.client_socket:
try:
encrypted_data = self.client_socket.recv(1024).decode('utf-8')
if not encrypted_data:
break
self.append_text(f"[客户端密文] {encrypted_data}", "cipher")
plain_text = xor_crypt(encrypted_data)
self.append_text(f"[客户端明文] {plain_text}", "plain")
except:
break
self.append_text("[系统] 客户端已断开")
self.send_btn.config(state='disabled')
self.client_socket = None
def send_message(self):
if not self.client_socket:
messagebox.showwarning("警告", "无客户端连接")
return
plain_msg = self.msg_entry.get()
if not plain_msg:
return
encrypted_msg = xor_crypt(plain_msg)
try:
self.client_socket.send(encrypted_msg.encode('utf-8'))
self.append_text(f"[我(密文)] {encrypted_msg}", "cipher")
self.append_text(f"[我(明文)] {plain_msg}", "plain")
self.msg_entry.delete(0, tk.END)
except:
self.append_text("[错误] 发送失败")
def on_closing(self):
self.running = False
if self.client_socket:
self.client_socket.close()
if self.server:
self.server.close()
self.window.destroy()
if name == "main":
ChatServer()
import socket
import threading
import tkinter as tk
from tkinter import scrolledtext, messagebox
def xor_crypt(data, key="secret"):
return ''.join(chr(ord(c) ^ ord(key[i % len(key)])) for i, c in enumerate(data))
class ChatClient:
def init(self):
self.window = tk.Tk()
self.window.title("加密聊天室 - 客户端")
self.window.geometry("500x600")
连接配置
tk.Label(self.window, text="服务端IP:").pack(pady=5)
self.ip_entry = tk.Entry(self.window, width=20)
self.ip_entry.insert(0, "192.168.56.1") # 修改为服务端IP
self.ip_entry.pack()
tk.Label(self.window, text="端口:").pack(pady=5)
self.port_entry = tk.Entry(self.window, width=20)
self.port_entry.insert(0, "3302")
self.port_entry.pack()
self.connect_btn = tk.Button(self.window, text="连接服务器", command=self.connect_server)
self.connect_btn.pack(pady=10)
聊天区域
self.text_area = scrolledtext.ScrolledText(self.window, width=60, height=25, state='disabled')
self.text_area.pack(pady=10, padx=10)
输入区域
self.input_frame = tk.Frame(self.window)
self.input_frame.pack(pady=5)
self.msg_entry = tk.Entry(self.input_frame, width=40)
self.msg_entry.pack(side=tk.LEFT, padx=5)
self.send_btn = tk.Button(self.input_frame, text="发送", command=self.send_message, state='disabled')
self.send_btn.pack(side=tk.LEFT)
self.client = None
self.running = False
self.window.protocol("WM_DELETE_WINDOW", self.on_closing)
self.window.mainloop()
def append_text(self, msg, tag=None):
self.text_area.config(state='normal')
self.text_area.insert(tk.END, msg + "\n", tag)
self.text_area.see(tk.END)
self.text_area.config(state='disabled')
def connect_server(self):
host = self.ip_entry.get()
port = int(self.port_entry.get())
try:
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client.connect((host, port))
self.append_text(f"[系统] 已连接到服务器 {host}:{port}")
self.connect_btn.config(state='disabled')
self.send_btn.config(state='normal')
self.running = True
# 启动接收线程
threading.Thread(target=self.receive_messages, daemon=True).start()
except Exception as e:
messagebox.showerror("错误", f"连接失败: {e}")
def receive_messages(self):
while self.running:
try:
encrypted_data = self.client.recv(1024).decode('utf-8')
if not encrypted_data:
break
self.append_text(f"[服务器密文] {encrypted_data}", "cipher")
plain_text = xor_crypt(encrypted_data)
self.append_text(f"[服务器明文] {plain_text}", "plain")
except:
break
self.append_text("[系统] 与服务器断开连接")
self.send_btn.config(state='disabled')
self.running = False
def send_message(self):
if not self.client:
return
plain_msg = self.msg_entry.get()
if not plain_msg:
return
encrypted_msg = xor_crypt(plain_msg)
try:
self.client.send(encrypted_msg.encode('utf-8'))
self.append_text(f"[我(密文)] {encrypted_msg}", "cipher")
self.append_text(f"[我(明文)] {plain_msg}", "plain")
self.msg_entry.delete(0, tk.END)
except:
self.append_text("[错误] 发送失败")
def on_closing(self):
self.running = False
if self.client:
self.client.close()
self.window.destroy()
if name == "main":
ChatClient.text_area.tag_configure('cipher', foreground='gray')
ChatClient.text_area.tag_configure('plain', foreground='green')
ChatClient()
(2)运行过程和结果截图


- 实验过程中遇到的问题和解决过程
问题1:
运行程序时出现 AttributeError: type object 'ChatClient' has no attribute 'text_area'
解决方案:
错误原因是直接在类外部通过类名调用了实例属性 tag_configure。将标签样式配置移到 init 方法中,在创建 self.text_area 之后立即执行 self.text_area.tag_configure(...)。修正后程序正常运行。
问题2:
启动服务端时提示 OSError: [WinError 10049] 请求的地址在其上下文中无效
解决方案:
默认 IP 192.168.56.1 在当前机器上不存在(如未配置虚拟网卡或局域网IP)。将代码中的默认 IP 改为 127.0.0.1(用于单机测试)或本机真实有效的局域网 IP(如 192.168.1.x)。也可保留为 0.0.0.0 监听所有接口,客户端连接时填写服务端实际 IP。
问题3:
客户端连接成功但发送消息后对方收不到,或界面卡死无响应
解决方案:
这是因为网络收发操作阻塞了主线程(tkinter 的事件循环)。通过在客户端和服务端分别创建独立的接收线程(threading.Thread)来解决,使界面保持响应。同时检查防火墙是否允许使用的端口(如 3302),并确保双方使用相同的端口和正确的 IP。
- 其他(感悟、思考)
通过本次实验,我对 Socket 编程和图形界面开发有了更深入的理解:
Socket 编程:TCP 协议提供了可靠的端到端通信,服务端需要 bind → listen → accept,客户端只需 connect。多线程是实现同时收发消息的关键,否则程序会因 recv 阻塞而无法发送。
加密与安全:实验中使用异或加密(XOR)虽然简单,但揭示了“数据在传输前必须加密”的基本原则。实际应用中需使用 AES、RSA 等强加密算法,并考虑密钥交换、身份认证等问题。明文密文同时显示有助于直观理解加密效果。
AI 辅助编程:借助大语言模型(如 DeepSeek),可以快速生成完整的 GUI + 网络 + 加密代码框架,大大减少了调试时间。但需要人工理解代码逻辑、修复属性错误等细节。AI 是强大的助手,但不能替代对基础原理的掌握。
图形界面的用户体验:相比控制台程序,GUI 程序操作直观、状态清晰。多线程保证了流畅性,颜色区分密文/明文提升了可读性。今后可以进一步增加文件传输、表情、消息提醒等功能。
调试与排错:实验过程中遇到的属性错误、地址无效、线程阻塞等问题,锻炼了阅读错误栈、定位代码行、分析原因的能力。善用 print 和日志输出能快速定位网络通信的异常点。
5. 参考资料
《Python编程:从入门到实践(第3版)》
Python Socket编程官方文档

浙公网安备 33010602011771号