课程:《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与队友合作的截图


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实现功能截图

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 编码的加解密机制,亲眼看到明文被加密成密文传输、再解密还原的全过程,深刻体会到数据在网络中传输时加密保护的必要性。
在调试程序的过程中,我遇到了连接失败、界面卡顿、加密报错等多种问题,通过一步步排查错误、修改代码、测试运行,不仅提升了自己的编程能力和问题解决能力,也更加理解了网络通信的稳定性、程序健壮性的重要意义。
