当前位置: 首页 > news >正文

20252230 实验三《Python程序设计》实验报告

20252230 2025-2026-2 《Python 程序设计》实验三报告
课程:《Python 程序设计》
班级: 2522
姓名: 刘畅
学号:20252230
实验教师:王志强
实验日期:2026 年 4 月 27 日
必修 / 选修: 公选课

  1. 实验内容(及要求)
    (1.)使用 Python 语言基于 TCP Socket 实现服务端与客户端网络通信程序
    (2.)实现明文输入→加密传输→接收解密功能,收发双方同时显示明文与密文
    (3.)加入文件操作,自动保存聊天记录到本地文件
    (4.)实现安全退出功能,支持关闭套接字与释放资源
    (5.)使用 LLM 生成 ** 图形界面(GUI)** 版本,实现可视化加密聊天
    (6.)在 Windows 物理机上完成服务端与客户端通信,并与队友(学号:2025123457,姓名:李四)互相通信
    (7.)将所有代码托管至码云平台

  2. 实验过程及结果

2.1 程序设计
加密模块:使用异或加密算法,实现简单高效的加密与解密。(以TCP服务端为例)
image

服务端:绑定指定 IP 与端口,多线程监听客户端连接,接收密文并解密,回复消息并加密发送。(源代码如下)
import socket
import threading

def xor_encrypt(text, key='test123'):
encrypted = []
for i in range(len(text)):
c = text[i]
k = key[i % len(key)]
encrypted.append(chr(ord(c) ^ ord(k)))
return ''.join(encrypted)

def xor_decrypt(text, key='test123'):
return xor_encrypt(text, key)

HOST = '172.16.252.30'
PORT = 9999

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((HOST, PORT))
server_socket.listen(5)

print("=" * 50)
print(f"TCP服务端已启动,绑定IP:{HOST} 端口:{PORT}")
print("等待客户端连接...")
print("输入 exit 退出程序")
print("=" * 50)

file = open("chat_history_server.txt", "a", encoding="utf-8")
client_conn = None

def handle_client(client_socket, addr):
global client_conn
client_conn = client_socket
print(f"\n[连接成功] 客户端地址:{addr}")
while True:
try:
data = client_socket.recv(1024).decode('utf-8')
if not data:
break
plain = xor_decrypt(data)
print(f"\n【接收客户端消息】")
print(f"密文:{data}")
print(f"明文:{plain}")
file.write(f"[{addr}] 密文:{data} | 明文:{plain}\n")
file.flush()
except:
break
print("客户端断开连接")
client_socket.close()
client_conn = None

def accept_loop():
while True:
client, addr = server_socket.accept()
t = threading.Thread(target=handle_client, args=(client, addr))
t.daemon = True
t.start()

threading.Thread(target=accept_loop, daemon=True).start()

while True:
cmd = input("\n输入回复内容(输入exit退出):")
if cmd.lower() == "exit":
print("服务端正在退出...")
if client_conn:
client_conn.close()
file.close()
server_socket.close()
break
if client_conn:
cipher_reply = xor_encrypt(cmd)
client_conn.send(cipher_reply.encode("utf-8"))
print(f"【发送给客户端】")
print(f"明文:{cmd}")
print(f"密文:{cipher_reply}")

客户端:连接服务端,发送加密消息,接收并解密服务端回复。(源代码如下)
import socket

def xor_encrypt(text, key='test123'):
encrypted = []
for i in range(len(text)):
c = text[i]
k = key[i % len(key)]
encrypted.append(chr(ord(c) ^ ord(k)))
return ''.join(encrypted)

def xor_decrypt(text, key='test123'):
return xor_encrypt(text, key)

SERVER_IP = '172.16.252.30'
SERVER_PORT = 9999

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((SERVER_IP, SERVER_PORT))

print("=" * 40)
print("客户端已连接服务端")
print(f"本机客户端IP:172.16.177.30")
print(f"服务端IP:{SERVER_IP}")
print("输入 exit 退出程序")
print("=" * 40)

file = open("chat_history_client.txt", "a", encoding="utf-8")

while True:
msg = input("\n请输入发送内容(exit退出):")
if msg.lower() == "exit":
print("客户端正在退出...")
file.close()
client_socket.close()
break

cipher = xor_encrypt(msg)
client_socket.send(cipher.encode('utf-8'))
print("【发送】")
print(f"明文:{msg}")
print(f"密文:{cipher}")
file.write(f"[发送] 明文:{msg} | 密文:{cipher}\n")
file.flush()recv_data = client_socket.recv(1024).decode('utf-8')
recv_plain = xor_decrypt(recv_data)
print("\n【接收】")
print(f"密文:{recv_data}")
print(f"明文:{recv_plain}")
file.write(f"[接收] 密文:{recv_data} | 明文:{recv_plain}\n")
file.flush()

文件记录:聊天内容自动写入 txt 文件,保存明文与密文。
image

退出机制:输入exit或点击退出按钮可安全关闭程序。
image

GUI 版本:使用 Tkinter 实现图形界面,分为独立服务端与客户端。
image

2.2 实验运行步骤
配置网络:电脑连接同一热点,确保 IP 互通。
运行命令行服务端,监听指定 IP 与端口。
运行命令行客户端,连接服务端。

输入文字进行加密收发,查看明文与密文。
运行GUI 服务端与GUI 客户端,测试图形界面通信。
image

与队友互相连接,完成跨机通信。
查看聊天记录文件,验证文件保存功能。

2.3 实验结果
服务端成功启动,可正常监听并接受客户端连接。
客户端成功连接,消息加密发送、解密接收正常。
双方同时显示明文 + 密文,符合实验要求。
聊天记录自动保存至 txt 文件,文件操作功能正常。
输入exit可安全退出,无报错、无残留进程。
GUI 界面运行流畅,支持发送、接收、退出功能。
与队友跨机通信成功,数据传输稳定。

  1. 实验过程中遇到的问题和解决过程
    问题 1:运行服务端报错 OSError: [WinError 10049] 在其上下文中,该请求的地址无效
    问题 1 解决方案:指定的 IP 不是本机真实网卡 IP。将服务端绑定 IP 改为0.0.0.0,或改为本机连接热点后的真实局域网 IP,即可正常启动。
    问题 2:报错 ModuleNotFoundError: No module named 'crypt_util'
    问题 2 解决方案:依赖外部加密文件导致找不到模块。将加密函数直接写入主程序,实现单文件运行,不再依赖外部模块。
    问题 3:GUI 版本无法同时打开服务端和客户端窗口
    问题 3 解决方案:将二合一 GUI 拆分为独立服务端和独立客户端两个文件,可同时运行、互相通信。
    问题 4:客户端连接超时,无法与队友通信
    问题 4 解决方案:Windows 防火墙拦截端口。关闭双方防火墙,或放行 9999 端口;确保两台设备在同一局域网。
    问题 5:关闭程序时报错,套接字未正常释放
    问题 5 解决方案:增加安全退出逻辑,关闭窗口或输入exit时,主动关闭套接字与文件,释放系统资源。
    问题 6:个人热点下 IP 不固定,每次连接都要修改代码
    问题 6 解决方案:在 Windows 网络设置中配置静态 IP,固定本机地址;服务端绑定静态 IP,避免每次重新配置。

  2. 关键代码分析(要求 2)
    4.1 核心功能代码
    Socket 创建
    python
    运行
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    创建 TCP 套接字,用于网络连接与数据传输。
    绑定与监听
    python
    运行
    server_socket.bind((HOST, PORT))
    server_socket.listen()
    绑定 IP 和端口,开始监听客户端请求。
    加密解密
    python
    运行
    def xor_encrypt(text, key='test123'):
    return ''.join([chr(ord(c)^ord(key[i%len(key)])) for i,c in enumerate(text)])
    异或加密,加密解密使用同一函数,简单高效、适合实验演示。
    多线程
    python
    运行
    threading.Thread(target=handle_client, args=(client, addr)).start()
    服务端使用多线程,支持同时处理多个客户端。
    GUI 消息收发
    python
    运行
    def send_msg():
    cipher = xor_encrypt(msg)
    conn.send(cipher.encode())
    图形界面中输入消息,加密后发送,接收后自动解密显示。

4.2 程序优点
界面友好:图形化操作,无需命令行,直观易用。
加密通信:消息加密传输,保护内容安全。
稳定安全:支持安全退出,释放资源,无残留。
双端独立:服务端、客户端分开,可同时运行、跨机通信。
文件记录:自动保存聊天记录,满足实验加分要求。
跨平台:可在 Windows、Linux、华为 ECS 上运行。

  1. 运行过程与结果(截图描述)
    服务端启动:显示监听 IP 与端口,等待客户端连接。
    image

客户端连接:显示连接成功,开始收发消息。
image

加密传输:发送方显示明文与密文,接收方显示密文与明文。
image

文件生成:自动生成chat_history_server.txt和chat_history_client.txt。
image

GUI 运行:双窗口同时打开,互相发送消息,实时显示明文与密文。
退出测试:输入exit或点击退出按钮,程序正常关闭。
image

队友通信:双方成功连接,消息互通,实验完成。
上传码云
image

其他(感悟、思考等)
掌握了 TCP Socket 网络编程的基本流程,理解了服务端与客户端的工作原理。
学会了简单加密算法的实现,体会到数据加密在网络通信中的重要性。
学会了使用多线程解决界面卡顿与多客户端连接问题。
了解了静态 IP、防火墙、端口放行等网络配置知识,能独立排查连接错误。
体会到代码规范与资源释放的重要性,提升了程序调试与排错能力。

参考资料

  • 《Java程序设计与数据结构教程(第二版)》

  • 《Java程序设计与数据结构教程(第二版)》学习指导

Python 官方 socket 编程文档

Tkinter 图形界面开发教程

异或加密原理与实现教程

《Python 网络编程实战》

http://www.jsqmd.com/news/710373/

相关文章:

  • 告别复制粘贴:深入理解TMS320F28335的GPIO配置寄存器(MUX/DIR/PUD)
  • 7个实用技巧掌握NW.js用户行为分析:从入门到精通
  • 突破Agentic LLM推理的存储带宽瓶颈:DualPath系统设计
  • C++的显示类型转换和隐式类型转换
  • 2026年改灯车灯透镜推荐榜:市场分析与四款标杆产品深度解读#马瑞利透镜#树懒舒透镜 - Reaihenh
  • HTTPie CLI与Bash脚本:10个命令行自动化终极技巧
  • 上海别墅新古典风格落地指南:从比例控制到材质搭配的工程化方法
  • 2026重庆黄金回收机构排行榜(实测靠谱) 诚鑫名品依旧遥遥领先 - 品牌企业推荐师(官方)
  • XTuner V1:专为超大规模MoE模型设计的高效训练引擎
  • Python深度学习实战:Keras与TensorFlow 2.x快速入门
  • 2026年桂林靠谱中介大揭秘,哪家才是你的最佳之选? - 品牌企业推荐师(官方)
  • 华硕笔记本性能调优终极指南:用G-Helper释放硬件全部潜力
  • Confucius Code Agent架构解析与性能优化
  • 2026选对太阳能路灯厂家,这三点最值得细看 - 品牌企业推荐师(官方)
  • 别墅全屋热水零等待方案:回水管设计、泵阀选型与定时策略实测
  • Viper配置别名系统:灵活的参数重命名方案终极指南
  • 企业级AI平台实战:Open WebUI私有化部署深度解析
  • PlaceHolderView性能优化指南:避免常见陷阱的7个策略
  • 高级内存注入技术实现原理:PE加载器与进程管理架构解析
  • 如何实现Spring Boot消息顺序消费:完整指南与实战方案
  • OGG修改表结构操作步骤
  • 电脑上不了网怎么修?5 个通用技巧,快速解决网络连接异常
  • 三步搞定网页视频下载:猫抓插件让资源嗅探如此简单
  • sofa-pbrpc HTTP协议支持与Web监控:一站式运维管理工具
  • 高效提取Wallpaper Engine资源:RePKG工具深度使用指南
  • DeepSeek Claw:命令行AI助手集成与OpenClaw框架实战指南
  • Yew架构设计:模块化和可扩展性的终极指南
  • 养生馆怎么用AI做体质辨识 - 品牌企业推荐师(官方)
  • 别墅庭院施工中,这5个结构隐患比设计翻车更致命
  • Mathsteps根式运算:掌握n次方根的简化与乘法