20252415 2025-2026-2 《Python程序设计》实验三报告
20252415 2025-2026-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 2524
姓名: 陈至晟
学号:20252415
实验教师:王志强
实验日期:2026年4月27日
必修/选修: 公选课
1.实验内容
(1)创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
-
创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
-
要求发送方输入内容,加密后并传输;接收方收到密文并解密和显示。要求:发方和收方同时输出明文和明文。
-
程序代码托管到码云。
-
添加文件操作
(2)使用LLM生成一个带图形界面的程序
2. 实验过程及结果
注:通信双方为20252415陈至晟和20252403李俊江
2.1.1创建服务端和客户端(包括文件操作功能)
服务端代码:SocketServer
# -*- coding: utf-8 -*-
# File : SocketServer.py
# Author : 无忆江南
# Create Time : 2026/4/27 19:05
# Python Version : 3.18.12
# " ————when it is dark enough ,we can see the stars."
import socket
def encrypt(plain):
return "".join(chr(ord(c) + 3) for c in plain)
def decrypt(cipher):
return "".join(chr(ord(c) - 3) for c in cipher)
def save_log(msg):
with open("chat_log.txt", "a", encoding="utf-8") as f:
f.write(msg + "\n")
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
HOST = "192.168.92.15"
PORT = 8888
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind((HOST, PORT))
server.listen(5)
print("server is listening...")
conn, addr = server.accept()
print(f"客户端已连接: {addr}")
save_log("===== 服务端启动,客户端连接成功 =====")
while True:
cipher_data = conn.recv(1024).decode("utf-8")
if not cipher_data or cipher_data.lower() == "quit":
print("客户端断开连接")
save_log("客户端断开连接")
break
plain_data = decrypt(cipher_data)
print(f"\n【接收】明文:{plain_data}")
print(f"【接收】密文:{cipher_data}")
save_log(f"[客户端] 明文:{plain_data} | 密文:{cipher_data}")
reply_plain = input("请输入回复内容:")
reply_cipher = encrypt(reply_plain)
conn.send(reply_cipher.encode("utf-8"))
print(f"【发送】明文:{reply_plain}")
print(f"【发送】密文:{reply_cipher}")
save_log(f"[服务端] 明文:{reply_plain} | 密文:{reply_cipher}")
if reply_plain.lower() == "quit":
print("服务端结束对话")
save_log("服务端结束对话")
break
conn.close()
server.close()
客户端代码:SocketClent
# -*- coding: utf-8 -*-
# File : SocketClent .py
# Author : 无忆江南
# Create Time : 2026/4/27 19:18
# Python Version : 3.18.12
# " ————when it is dark enough ,we can see the stars."
import socket
def encrypt(plain):
return "".join(chr(ord(c) + 3) for c in plain)
def decrypt(cipher):
return "".join(chr(ord(c) - 3) for c in cipher)
def save_log(msg):
with open("chat_log.txt", "a", encoding="utf-8") as f:
f.write(msg + "\n")
HOST = "192.168.92.15"
PORT = 8888
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((HOST, PORT))
print("已连接服务端")
save_log("===== 客户端已连接 =====")
while True:
send_plain = input("\n请输入发送内容:")
send_cipher = encrypt(send_plain)
print(f"【发送】明文:{send_plain}")
print(f"【发送】密文:{send_cipher}")
save_log(f"[客户端] 明文:{send_plain} | 密文:{send_cipher}")
client.send(send_cipher.encode("utf-8"))
if send_plain.lower() == "quit":
print("客户端退出")
save_log("客户端退出")
break
recv_cipher = client.recv(1024).decode("utf-8")
recv_plain = decrypt(recv_cipher)
print(f"【接收】明文:{recv_plain}")
print(f"【接收】密文:{recv_cipher}")
save_log(f"[服务端] 明文:{recv_plain} | 密文:{recv_cipher}")
client.close()
2.1.2双方通讯截图
(1)我作为客户端

(2)我作为服务端

(3)使用云服务器我作为服务端

(4)使用云服务器我作为客户端

2.1.3代码托管至码云
2.2使用LLM生成一个带图形界面的程序
2.2.1分析关键代码的功能和使用方法
(1)通用加密解密模块:发送方调用caesar_encrypt(明文)加密后传输;接收方调用caesar_decrypt(密文)还原明文。
# 加密:所有字符Unicode编码移位+3
def caesar_encrypt(text, shift=3):
encrypted = ""
for char in text:
encrypted += chr(ord(char) + shift)
return encrypted
# 解密:密文字符Unicode编码移位-3
def caesar_decrypt(text, shift=3):
decrypted = ""
for char in text:
decrypted += chr(ord(char) - shift)
return decrypted
(2)TCP Socket 通信模块:服务端输入端口点击“启动监听”;客户端输入服务端IP和端口,点击“连接”。
# 服务端:创建套接字、绑定端口、监听
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.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client_socket.connect((ip, port))
(3)图形化界面(GUI)模块
# 构建主窗口
self.root = tk.Tk()
self.root.title("TCP 服务端(加密通信+文件传输)")
self.root.geometry("750x700")
# 核心组件
self.port_entry = ttk.Entry(top_frame, width=10)
self.send_entry = ttk.Entry(send_frame, width=40)
self.msg_text = scrolledtext.ScrolledText(self.root, width=90, height=35)
self.start_btn = ttk.Button(top_frame, text="启动监听", command=self.start_server)
(4)文本消息收发模块:输入明文,点击“发送加密消息”;接收方自动解密并显示。
# 发送文本(加密传输)
def send_to_client(self):
plain_text = self.send_entry.get().strip()
cipher_text = caesar_encrypt(plain_text)
client_sock.send(cipher_text.encode("utf-8"))
# 接收文本(解密显示)
def handle_client(self, client_sock, addr):
data = client_sock.recv(4096).decode("utf-8")
plain_text = caesar_decrypt(data)
self.log(f"📩 收到 {addr} 密文:{data}")
self.log(f"🔓 解密后明文:{plain_text}\n")
(5)文件加密传输模块:点击“选择并发送文件”选择本地文件,接收方自动解密保存。
# 发送文件(加密传输)
def send_file(self):
file_path = filedialog.askopenfilename()
filename = file_path.split("/")[-1].split("\\")[-1]
with open(file_path, "r", encoding="utf-8") as f:
plain_content = f.read()
cipher_content = caesar_encrypt(plain_content)
send_data = f"FILE:{filename}:{cipher_content}"
client_sock.send(send_data.encode("utf-8"))
# 接收文件(解密保存)
def handle_client(self, client_sock, addr):
if data.startswith("FILE:"):
_, filename, cipher_content = data.split(":", 2)
plain_content = caesar_decrypt(cipher_content)
save_path = f"接收_服务端_{filename}"
with open(save_path, "w", encoding="utf-8") as f:
f.write(plain_content)
2.2.2优点
(1) 功能完整
涵盖TCP多客户端、GUI、双向加密、明文密文双显示、文件传输,支持中文无乱码。
(2)操作便捷
全图形化操作,无需复杂命令,新手可快速上手。
(3)加密适配性强
Unicode全域移位加密,支持所有字符,算法简单,适合学习演示。
(4) 通信稳定
基于TCP协议,数据传输无丢包、不重复,保障解密和文件完整性。
(5) 并发性能优
多线程设计,GUI不卡顿,支持多客户端同时通信。
(6)无依赖跨平台
纯Python内置库实现,无需额外安装,支持多操作系统。
(7) 日志可视化
实时显示操作过程。
2.2.3运行过程和结果截图
(1)自行连接
- 服务端

- 客户端

(2)同学互相连接
- 服务端

- 客户端

2.2.4 程序代码托管到码云
3. 实验过程中遇到的问题和解决过程
- 问题1:联机总是失败
- 问题1解决方案:检查网络是否同一个,ip地址是否更改
- 问题2:使用凯撒加密函数时输入中文加解密后出现乱码
- 问题2解决方案:查询后得知原来的凯撒加密只处理英文字母(char.isalpha()判断),中文的ord()值远大于英文字母,导致移位计算出错,解密后变成乱码。修改为Unicode移位加密:取每个字符的 Unicode 编码直接 +3。
其他(感悟、思考等)
记得检查防火墙和云服务器安全组规则设置

浙公网安备 33010602011771号