2025-2026-2 《Python程序设计》实验报告
课程:《Python程序设计》
班级: 2432
姓名: 赵怡喆
学号:20243213
实验教师:王志强
实验日期:2026年4月27日
必修/选修: 公选课
1.实验内容
(一)实验内容
(1.)使用 Python 语言基于 TCP Socket 实现服务端与客户端网络通信程序
(2.)实现明文输入→加密传输→接收解密功能,收发双方同时显示明文与密文
(3.)加入文件操作,自动保存聊天记录到本地文件
(4.)实现安全退出功能,支持关闭套接字与释放资源
(5.)使用 LLM 生成图形界面(GUI)版本,实现可视化加密聊天
(6.)在 Windows 物理机上完成服务端与客户端通信,并与队友(学号:20252230,姓名:刘畅)互相通信
(7.)将所有代码托管至码云平台以下是该代码的测试
二、实验环境
1. 操作系统:Windows 10/11
2. 开发工具:Python 3.8及以上版本
3. 核心库:socket(网络通信)、threading(多线程)、tkinter(图形界面)
4. 网络环境:同一局域网(共享热点/局域网),确保设备IP互通
三、实验原理
1. TCP Socket通信原理
TCP是面向连接、可靠的传输层协议,通信流程分为服务端和客户端:
服务端:创建套接字→绑定IP和端口→监听连接→接受客户端连接→数据收发→关闭连接;
客户端:创建套接字→连接服务端→数据收发→关闭连接。
本实验采用TCP协议保证数据传输的稳定性与完整性。
2. 异或加密算法原理
异或加密是一种对称加密算法。加密与解密使用同一函数和密钥,具有实现简单、运算高效的特点,适合轻量级通信加密场景。
3. 多线程原理
服务端采用多线程技术,主线程负责监听客户端连接,子线程独立处理每个客户端的消息收发,避免单线程阻塞,支持同时处理多个客户端连接。
4. 文件操作原理
通过Python文件IO操作,将通信过程中的明文、密文数据实时写入文本文件,实现聊天记录的自动持久化存储,支持数据追溯。
四、实验内容与步骤
(一)核心功能模块设计
1. 加密解密模块:基于异或算法实现统一的加密、解密函数,服务端与客户端共用相同密钥。
2. TCP服务端模块:绑定IP与端口,多线程监听客户端连接,接收密文解密、加密回复消息。
3. TCP客户端模块:主动连接服务端,加密发送消息、接收密文并解密显示。
4. 文件记录模块:自动将通信的明文、密文写入本地文本文件,实时刷新保存。
5. 安全退出模块:支持输入exit指令安全关闭程序,释放套接字与文件资源。
6. GUI图形界面模块:基于Tkinter开发独立的服务端、客户端图形界面,实现可视化通信。
(二)实验运行步骤
1. 网络
将实验设备连接至同一热点/局域网,关闭Windows防火墙或放行9999端口,确保设备间网络互通。
2. 命令行版本测试
① 运行服务端程序,绑定局域网IP与4444端口,启动监听;
② 运行客户端程序,输入服务端IP完成连接;
③ 双方输入消息进行加密收发,查看明文、密文显示效果;
④ 输入`exit`指令,测试安全退出功能。


3. GUI版本测试
分别运行GUI服务端、GUI客户端程序,通过图形界面完成消息收发、退出操作,验证界面交互与通信功能。


4. 跨机通信测试
与队友设备连接同一局域网,使用对方设备IP进行连接,实现跨机加密通信。

5. 功能验证
查看自动生成的聊天记录文本文件,验证文件保存功能的完整性。
- 提交到码云

五、核心代码实现
(发送方)
Have you ever seen Los Angeles at 4 a.m?
import socket
import os
def encrypt(message, key):
encrypted = []
key_length = len(key)
for i, char in enumerate(message):
encrypted_char = chr(ord(char) ^ ord(key[i % key_length]))
encrypted.append(encrypted_char)
return ''.join(encrypted).encode()
def decrypt(ciphertext, key):
return encrypt(ciphertext.decode(), key).decode()
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
HOST = "192.168.43.5"
PORT = 4445
key = os.urandom(16).decode('latin-1')
server.bind((HOST, PORT))
server.listen(5)
print("服务端已经启动,等待客户端连接......")
print(f"服务器地址:{HOST}:{PORT}")
while True:
conn, addr = server.accept()
print(f"已连接客户端:{addr}")
conn.send(key.encode('latin-1'))
print("已发送加密密钥给客户端")
try:
while True:
encrypted_data = conn.recv(1024)
if not encrypted_data:
print(f"客户端 {addr} 断开连接")
break
data = decrypt(encrypted_data, key)
if data == "exit":
print(f"客户端 {addr} 退出聊天")
break
print(f"客户端 {addr}(明文):{data}")
print(f"客户端 {addr}(密文):{encrypted_data.hex()}")
send_msg = input("我:")
encrypted_msg = encrypt(send_msg, key)
conn.send(encrypted_msg)
print(f"我(明文):{send_msg}")
print(f"我(密文):{encrypted_msg.hex()}")
if send_msg == "exit":
break
except Exception as e:
print(f"与客户端 {addr} 通信时发生错误:{e}")
finally:
conn.close()
server.close()
另一方
Have you ever seen Los Angeles at 4 a.m?
import socket
def encrypt(message, key):
encrypted = []
key_length = len(key)
for i, char in enumerate(message):
encrypted_char = chr(ord(char) ^ ord(key[i % key_length]))
encrypted.append(encrypted_char)
return ''.join(encrypted).encode()
def decrypt(ciphertext, key):
return encrypt(ciphertext.decode(), key).decode()
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
HOST = "192.168.43.5" # 服务器的IP地址
PORT = 4445
client.connect((HOST, PORT))
print("已连接服务端!输入exit退出聊天!")
key = client.recv(16).decode('latin-1')
print("已接收加密密钥")
while True:
# 发送数据
send_msg = input("我:")
encrypted_msg = encrypt(send_msg, key)
client.send(encrypted_msg)
print(f"我(明文):{send_msg}")
print(f"我(密文):{encrypted_msg.hex()}")
if send_msg == "exit":
break
encrypted_data = client.recv(1024)
if not encrypted_data:
print("聊天结束")
break
data = decrypt(encrypted_data, key)
if data == "exit":
print("聊天结束")
break
print(f"\n服务端(明文):{data}")
print(f"服务端(密文):{encrypted_data.hex()}")
client.close()
六、实验过程问题与解决方案
1 服务端报错:`OSError: [WinError 10049] 地址无效` : 绑定IP非本机真实IP,将服务端IP改为`0.0.0.0`或本机局域网静态IP
2. GUI版本无法同时打开服务端和客户端窗口 : 将二合一GUI拆分为独立的服务端、客户端文件,分别运行实现双端通信
3. 客户端连接超时,跨机通信失败 :关闭Windows防火墙,确保设备在同一局域网
4. 关闭程序时报错,套接字资源未释放 :完善安全退出逻辑,退出时主动关闭套接字和文件,释放系统资源
七、实验结果
1. 通信功能:服务端成功启动并监听端口,客户端可正常连接,双向消息收发稳定无异常。
2. 加密功能:消息传输全程采用异或加密,发送方显示明文+密文,接收方自动解密显示,加密解密效果符合预期。
3. 多线程功能:服务端支持并发处理多个客户端连接,无阻塞、无卡顿。
4. 文件存储:自动生成`chat_history_server.txt`和`chat_history_client.txt`文件,完整保存所有通信的明文与密文。
八、程序优缺点分析
(一)优点
1. 功能完整:集成TCP通信、异或加密、多线程、文件存储、GUI界面等核心功能,满足实验全部要求。
2. 易用性强:提供命令行与图形化双版本,图形界面无需命令行操作,适合新手使用。
3. 安全性:采用异或加密传输消息,避免明文传输导致的数据泄露。
4. 稳定性高:完善的异常处理与安全退出机制,程序运行稳定,资源释放及时。
5. 跨平台性:代码可在Windows、Linux等系统运行,适配多种环境。
6. 实用性:自动保存聊天记录,支持数据追溯,符合实际应用场景需求。
(二)不足
1. 异或加密为基础对称加密算法,安全性有限,不适合高安全要求的通信场景。
2. 服务端仅支持文本消息传输,未实现文件、图片等多媒体数据传输功能。
3. GUI界面设计较为简洁,未添加消息历史滚动、用户昵称等拓展功能。
九、实验感悟与思考
通过本次实验,我系统掌握了Python TCP Socket网络编程的完整流程,深入理解了服务端与客户端的通信原理,熟练实现了连接建立、数据收发、连接关闭等核心操作。同时,我掌握了异或加密算法的实现与应用,深刻体会到数据加密在网络通信中的重要性。
多线程技术的应用让我解决了程序阻塞问题,提升了对并发编程的理解;文件操作与GUI界面开发,让我学会了数据持久化与图形化交互的实现方法。实验过程中,我独立排查了IP配置、防火墙、端口拦截等网络故障,掌握了局域网通信的调试技巧。
本次实验不仅提升了我的编程与调试能力,更让我认识到代码规范、资源释放、异常处理的重要性。未来可对程序进行优化,采用更安全的加密算法,拓展多媒体传输功能,完善界面设计,让程序更贴合实际应用需求。
浙公网安备 33010602011771号