三亩地.
  • 首页
  • 学习日记
  • 项目实战
  • 学习方法
  • 代码技巧
  • 避坑指南
  • 调试经验
  • 实战教程
  • 编程思维
  • 资讯中心
  • 关于我们

资讯详情

深入了解每一个知识点

  • 首页
  • /
  • 资讯中心
  • /
  • 文章详情

20241223 2025-2026-2 《Python程序设计》实验三报告

📅 2026/7/16 5:38:45 👁️ 阅读次数 📝 编程学习
20241223 2025-2026-2 《Python程序设计》实验三报告

20241223 2025-2026-2 《Python程序设计》实验三报告

课程:《Python程序设计》
班级: 2412
姓名: 闵岩竣
学号: 20241223
实验教师:王志强
实验日期:2026年4月27日
必修/选修: 公选课
1.1实验内容

创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。

1.2实验要求

注意事项:

每人必须做一次客户端和一次服务端,且要和队友(20254324阳志敏)互相通信。

要求1:

(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;

(2)要求发送方输入内容,加密后并传输;接收方收到密文并解密和显示。要求:发方和收方同时输出明文和明文。

(3)程序代码托管到码云。

(4)添加文件操作,有加分。(可选项)

要求2:使用LLM生成一个带图形界面的程序

(1)分析关键代码的功能和使用方法

(2)分析生成程序的优点

(3)给出运行过程和结果截图

(4)程序代码托管到码云。
2. 实验过程及结果
2.1 加密原理
采用 XOR(异或)对称加密 + Base64 编码 组合方式进行加密传输

加密

def encrypt(msg):
encrypted = ""
for i, c in enumerate(msg):
encrypted += chr(ord(c) ^ ord(KEY[i % len(KEY)])) # XOR 异或
return base64.b64encode(encrypted.encode()).decode() # Base64

解密

def decrypt(msg):
decoded = base64.b64decode(msg.encode()).decode() # Base64 解码
decrypted = ""
for i, c in enumerate(decoded):
decrypted += chr(ord(c) ^ ord(KEY[i % len(KEY)])) # XOR 异或
return decrypted
2.2创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;要求发送方输入内容,加密后并传输;接收方收到密文并解密和显示。要求:发方和收方同时输出明文和密文
(1)服务端代码:
import socket
import base64

KEY = "12345678"
def encrypt(msg):
encrypted = ""
for i, c in enumerate(msg):
encrypted += chr(ord(c) ^ ord(KEY[i % len(KEY)]))
return base64.b64encode(encrypted.encode()).decode()
def decrypt(msg):
decoded = base64.b64decode(msg.encode()).decode()
decrypted = ""
for i, c in enumerate(decoded):
decrypted += chr(ord(c) ^ ord(KEY[i % len(KEY)]))
return decrypted
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
HOST = "0.0.0.0"
PORT = 4444

server.bind((HOST, PORT))
server.listen(5)
print(f"服务端已启动,监听端口 {PORT}...")

while True:
conn, addr = server.accept()
print(f"客户端 {addr} 已连接!")
try:
while True:
encrypted_data = conn.recv(1024).decode()
if not encrypted_data:
break
plaintext = decrypt(encrypted_data)
print(f"【接收】明文: {plaintext}")
print(f"【接收】密文: {encrypted_data}")

        send_msg = input("请输入回复: ")encrypted_reply = encrypt(send_msg)conn.send(encrypted_reply.encode())print(f"【发送】明文: {send_msg}")print(f"【发送】密文: {encrypted_reply}")
except Exception as e:print(f"连接出错: {e}")
finally:conn.close()print(f"客户端 {addr} 已断开连接")

(2)客户端代码:
import socket
import base64

KEY = "12345678"

def encrypt(msg):
encrypted = ""
for i, c in enumerate(msg):
encrypted += chr(ord(c) ^ ord(KEY[i % len(KEY)]))
return base64.b64encode(encrypted.encode()).decode()

def decrypt(msg):
decoded = base64.b64decode(msg.encode()).decode()
decrypted = ""
for i, c in enumerate(decoded):
decrypted += chr(ord(c) ^ ord(KEY[i % len(KEY)]))
return decrypted

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
HOST = "172.16.231.182"
PORT = 4444

client.connect((HOST, PORT))
print("已连接到服务端!")

try:
while True:
send_msg = input("请输入发送内容: ")
encrypted = encrypt(send_msg)
client.send(encrypted.encode())

    print(f"【发送】明文: {send_msg}")print(f"【发送】密文: {encrypted}")encrypted_reply = client.recv(1024).decode()if not encrypted_reply:breakreply = decrypt(encrypted_reply)print(f"【接收】明文: {reply}")print(f"【接收】密文: {encrypted_reply}")

except Exception as e:
print(f"连接出错: {e}")
finally:
client.close()
print("客户端已断开连接")
2.3与队友合作的截图

屏幕截图 2026-05-09 112508

屏幕截图 2026-05-09 112347
2.4代码托管到码云
服务端代码:https://gitee.com/min-yanjun/112112/commit/2d19b2bb1a798c565af664b7782f0531785ded73
客户端代码:https://gitee.com/min-yanjun/112112/commit/e4987abb4ce95e5e9b417bcc5b7f5d255ddc8a30
3.1使用LLM生成一个带图形界面的程序
服务端
import socket
import base64
import threading
import tkinter as tk
from tkinter import scrolledtext, Entry, Button

KEY = "12345678"

def encrypt(msg):
encrypted = ""
for i, c in enumerate(msg):
encrypted += chr(ord(c) ^ ord(KEY[i % len(KEY)]))
return base64.b64encode(encrypted.encode()).decode()

def decrypt(msg):
decoded = base64.b64decode(msg.encode()).decode()
decrypted = ""
for i, c in enumerate(decoded):
decrypted += chr(ord(c) ^ ord(KEY[i % len(KEY)]))
return decrypted

class ServerGUI:
def init(self, root):
self.root = root
self.root.title("服务端 GUI")
self.root.geometry("600x450")

    self.chat = scrolledtext.ScrolledText(root, state=tk.DISABLED)self.chat.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)self.entry = Entry(root)self.entry.pack(fill=tk.X, padx=10, pady=5)self.entry.bind("<Return>", self.send)self.btn = Button(root, text="发送", command=self.send)self.btn.pack(pady=5)self.client = Nonethreading.Thread(target=self.start_server, daemon=True).start()def log(self, text):self.chat.config(state=tk.NORMAL)self.chat.insert(tk.END, text + "\n")self.chat.config(state=tk.DISABLED)self.chat.see(tk.END)def start_server(self):server = socket.socket()server.bind(("0.0.0.0", 4444))server.listen(1)self.log("服务端已启动,等待客户端连接...")self.client, addr = server.accept()self.log(f"客户端 {addr} 已连接")while True:try:data = self.client.recv(1024).decode()if not data: breakplain = decrypt(data)self.log(f"[客户端] 明文:{plain}")self.log(f"[客户端] 密文:{data}")except:breakdef send(self, event=None):msg = self.entry.get().strip()if not msg or not self.client:returncipher = encrypt(msg)self.client.send(cipher.encode())self.log(f"[我] 明文:{msg}")self.log(f"[我] 密文:{cipher}")self.entry.delete(0, tk.END)

if name == "main":
root = tk.Tk()
ServerGUI(root)
root.mainloop()
客户端
import socket
import base64
import threading
import tkinter as tk
from tkinter import scrolledtext, Entry, Button

KEY = "12345678"

def encrypt(msg):
encrypted = ""
for i, c in enumerate(msg):
encrypted += chr(ord(c) ^ ord(KEY[i % len(KEY)]))
return base64.b64encode(encrypted.encode()).decode()

def decrypt(msg):
decoded = base64.b64decode(msg.encode()).decode()
decrypted = ""
for i, c in enumerate(decoded):
decrypted += chr(ord(c) ^ ord(KEY[i % len(KEY)]))
return decrypted

class ClientGUI:
def init(self, root):
self.root = root
self.root.title("客户端 GUI")
self.root.geometry("600x450")

    self.chat = scrolledtext.ScrolledText(root, state=tk.DISABLED)self.chat.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)self.entry = Entry(root)self.entry.pack(fill=tk.X, padx=10, pady=5)self.entry.bind("<Return>", self.send)self.btn = Button(root, text="发送", command=self.send)self.btn.pack(pady=5)self.sock = socket.socket()threading.Thread(target=self.connect, daemon=True).start()def log(self, text):self.chat.config(state=tk.NORMAL)self.chat.insert(tk.END, text + "\n")self.chat.config(state=tk.DISABLED)self.chat.see(tk.END)def connect(self):try:self.sock.connect(("127.0.0.1", 4444))  # 队友IP改这里self.log("已连接服务端")while True:data = self.sock.recv(1024).decode()if not data: breakplain = decrypt(data)self.log(f"[服务端] 明文:{plain}")self.log(f"[服务端] 密文:{data}")except:self.log("连接失败")def send(self, event=None):msg = self.entry.get().strip()if not msg:returncipher = encrypt(msg)self.sock.send(cipher.encode())self.log(f"[我] 明文:{msg}")self.log(f"[我] 密文:{cipher}")self.entry.delete(0, tk.END)

if name == "main":
root = tk.Tk()
ClientGUI(root)
root.mainloop()
3.2实现功能截图

屏幕截图 2026-05-09 114900
3.3程序优点
采用图形化界面,操作简单直观,无需使用命令行,学习与演示效果更好。
自带XOR+Base64 加解密,收发双方自动显示明文、密文,完全满足课程实验要求。
基于TCP 协议通信,数据传输稳定可靠,适合局域网内双人互相通信。
使用多线程处理消息接收,界面不会卡顿,发送、接收可同时进行。
3.4关键代码功能与使用方法
加解密函数:采用XOR 异或运算 + Base64 编码实现对称加密;发送前自动将明文加密为密文传输,接收后自动解密还原明文,全程同步显示明文与密文。
Socket 网络编程:基于TCP 协议实现可靠通信;服务端绑定端口并监听客户端连接,客户端指定服务端 IP 与端口主动发起连接,实现稳定点对点通信。
Tkinter 图形界面:使用滚动文本框展示聊天记录,输入框编辑消息,支持按钮 + 回车双方式发送,完全替代命令行黑窗口,操作更直观。
多线程 threading:创建独立后台线程接收网络消息,不阻塞图形界面主线程,实现收发消息同时进行,界面流畅不卡顿、不卡死。
日志显示功能:聊天区域自动记录收发状态、明文、密文,自动滚动到最新消息,便于查看通信过程与实验截图。
连接管理:服务端启动后自动等待客户端接入,客户端启动后自动尝试连接,连接状态实时提示,程序运行更稳定。
3.5llm程序托管到码云
服务端https://gitee.com/min-yanjun/112112/blob/master/server_gui.py
客户端https://gitee.com/min-yanjun/112112/blob/master/client_gui.py
4.1实验过程中遇到的问题和解决过程
问题 1:客户端与服务端通信时出现连接中断,报错 WinError 10053。
解决方案:添加异常捕获处理和循环监听机制,优化连接稳定性,程序断开后可正常退出不崩溃。
问题 2:消息传输后无法正确显示明文与密文,加解密结果不匹配。
解决方案:统一服务端与客户端的加密密钥、加密规则,确保发送方加密、接收方解密逻辑完全一致。
4.2感悟
通过本次 Python Socket 加密通信实验,我完整实践了TCP 网络编程与数据加密技术的结合应用,真正实现了从理论知识到实际编程的落地,收获非常充实。
实验中,我掌握了服务端监听、客户端连接、消息收发的完整流程,理解了 IP 地址与端口在局域网通信中的重要作用,学会了如何让两台电脑通过网络建立稳定连接。同时,我亲手实现了XOR 异或加密 + Base64 编码的加解密机制,亲眼看到明文被加密成密文传输、再解密还原的全过程,深刻体会到数据在网络中传输时加密保护的必要性。
在调试程序的过程中,我遇到了连接失败、界面卡顿、加密报错等多种问题,通过一步步排查错误、修改代码、测试运行,不仅提升了自己的编程能力和问题解决能力,也更加理解了网络通信的稳定性、程序健壮性的重要意义。

编程学习 技术分享 实战经验

相关新闻

CANN/opbase:设置张量原始地址

2026/7/16 5:37:48

影刀RPA如何实现店群自动化:拆解多浏览器并发,打造拼多多与TEMU的“超级航母”矩阵

2026/7/16 5:37:48

一个老旧小区门禁改造项目的技术选型复盘:从云端到边缘

2026/7/10 21:30:59

最新新闻

Cursor配置Java+SpringBoot开发环境全指南(Windows版)

2026/7/16 5:37:30

基于Multisim的楼道触摸延时开关设计与仿真实践

2026/7/16 5:37:53

Python排列组合实战:利用itertools高效生成密码字典

2026/7/16 5:37:30

不做GEO流量被AI搜索抢走:这5种老旧外链玩法赶紧停掉

2026/7/16 5:37:30

龙虾 AI 网关持续离线?OpenClaw 2.7.9 针对性修复实操干货

2026/7/16 5:37:30

【大白话说Java面试题 第175题】【07_Redis篇】第11题:Redis 的过期策略和内存淘汰策略

2026/7/16 5:36:08

日新闻

2026 年当下,诚信的G652D光纤厂家哪个好,揭秘!这根光纤如何让G652D性能暴涨? - 品质体验官

2026/7/16 0:00:35

AI辅助开发生态全景:从方法论到工具链的完整图景

2026/7/16 0:00:35

Toon Boom Harmony 高效工作流:从节点视图到镜头标记的实战技巧

2026/7/16 0:00:35

周新闻

npm 与 cnpm 镜像源对比:4 种配置方案实测与安全性分析

2026/7/15 18:12:48

Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动

2026/7/15 18:14:35

IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结

2026/7/15 15:59:46

月新闻

[C++]内存管理:串顺序存储的内存回收

2026/7/15 17:50:33

足球口袋教练 HarmonyOS 离线应用实战(03/20):ArkUI 首页仪表盘搭建

2026/7/15 17:06:27

抖音内容监控助手:告别手动刷新,让优质内容主动找你

2026/7/15 16:38:12

分类目录

  • 学习日记
  • 项目实战
  • 学习方法
  • 代码技巧
  • 避坑指南
  • 调试经验

热门标签

JavaScript Python Java 前端开发 后端开发 算法 数据结构 项目实战

关于三亩地

三亩地是一个专注于编程学习的平台,以真实学习日记为载体,分享编程学习经验、项目实操技巧和高效学习方法。

快速链接

学习日记

项目实战

学习方法

资讯中心

联系方式

邮箱:contact@mfbz.cn

微信:sanmudi_code

QQ 群:123456789

© 2026 三亩地 编程学习日记 版权所有 | mfbz.cn