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

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

🎯 2025-2026-2 《Python程序设计》实验x报告

课程名称 《Python程序设计》 班级 2531
姓名 李世航 学号 20253117
实验教师 王志强 实验日期 2026年4月27日
课程类型 公选课

✨ 一、实验内容

  • 创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。每人必须做一次客户端和一次服务端,且要和队友(标注学号姓名)互相通信。

  • 要求1:

    (1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
    (2)要求发送方输入内容,加密后并传输;接收方收到密文并解密和显示。要求:发方和收方同时输出密文和明文。
    (3)程序代码托管到码云。
    (4)添加文件操作,有加分。(可选项)
    
  • 要求2:使用LLM生成一个带图形界面的程序

    (1)分析关键代码的功能和使用方法
    (2)分析生成程序的优点
    (3)给出运行过程和结果截图
    (4)程序代码托管到码云。
    

🔍 二、实验过程及结果

📋 2.1 实验准备

我的队友是20253202吴江浩

📈 2.2 实验步骤

  1. 步骤1: 我首先跟着老师编写了初步的代码,并实现了自己扮演客户端和服务端的通信
import socket
# 创建TCP   socket(买手机)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#办电话卡
HOST = "0.0.0.0"
PORT = 1245server_socket.bind((HOST, PORT))#电话卡插手机
server_socket.listen(1)
print("服务端已启动,等待连接……")conn, addr = server_socket.accept()print(f"已连接到客户端: {addr}")#接收消息
data = conn.recv(1024).decode("utf-8")
print(f"收到客户端消息: {data}")send_msg = input("我:")
conn.send(send_msg.encode("utf-8"))conn.close()
server_socket.close()
import socketclient = socket.socket(socket.AF_INET, socket.SOCK_STREAM)HOST = "127.0.0.1"
PORT = 1245client.connect((HOST, PORT))
print("已连接到服务端")# 发送消息
send_msg = input("我:")
client.send(send_msg.encode("utf-8"))# 接收消息
data = client.recv(1024).decode("utf-8")
print(f"服务端: {data}")client.close()

屏幕截图 2026-04-27 195630

  1. 步骤2: 之后,我升级了代码,实现循环和加密功能
import socket# 加密函数
def encrypt(text, key=3):result = ""for char in text:result += chr(ord(char) + key)return result# 解密函数
def decrypt(text, key=3):result = ""for char in text:result += chr(ord(char) - key)return result# 创建TCP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)HOST = "192.168.43.17" 
PORT = 2225server_socket.bind((HOST, PORT))
server_socket.listen(1)
print("服务端已启动,等待连接……")conn, addr = server_socket.accept()
print(f"已连接到客户端: {addr}")# 打开文件记录聊天
file = open("chat_log.txt", "a", encoding="utf-8")while True:# 接收密文cipher = conn.recv(1024).decode("utf-8")if not data:break# 解密plain = decrypt(cipher)print("\n【收到】")print("密文:", cipher)print("明文:", plain)# 写入文件file.write(f"客户端密文:{cipher},明文:{plain}\n")file.flush()if plain == "exit":break# 发送消息send_plain = input("\n我:")send_cipher = encrypt(send_plain)# 输出明文 + 密文print("\n【发送】")print("明文:", send_plain)print("密文:", send_cipher)# 发送密文conn.send(send_cipher.encode("utf-8"))# 写入文件file.write(f"服务端明文:{send_plain},密文:{send_cipher}\n")file.flush()if send_plain == "exit":breakfile.close()
conn.close()
server_socket.close()
import socket# 加密
def encrypt(text, key=3):result = ""for char in text:result += chr(ord(char) + key)return result# 解密
def decrypt(text, key=3):result = ""for char in text:result += chr(ord(char) - key)return resultclient = socket.socket(socket.AF_INET, socket.SOCK_STREAM)HOST = "192.168.43.17"
PORT = 2225client.connect((HOST, PORT))
print("已连接到服务端")# 打开文件记录聊天
file = open("client_log.txt", "a", encoding="utf-8")while True:# 发送send_plain = input("\n我:")send_cipher = encrypt(send_plain)print("\n【发送】")print("明文:", send_plain)print("密文:", send_cipher)client.send(send_cipher.encode("utf-8"))# 写入文件file.write(f"客户端明文:{send_plain},密文:{send_cipher}\n")file.flush()if send_plain == "exit":break# 接收cipher = client.recv(1024).decode("utf-8")plain = decrypt(cipher)print("\n【收到】")print("密文:", cipher)print("明文:", plain)# 写入文件file.write(f"服务端密文:{cipher},明文:{plain}\n")file.flush()if plain == "exit":breakfile.close()
client.close()
  1. 步骤3: 下面,是我和队友互相通信
    4.1 我首先配置了我手机热点的IP地址为198.168.43.17
    屏幕截图 2026-05-02 102813
    4.2 之后,我和队友链接后进行通信
    image
    image
    这是文件操作

image

  1. 步骤4:使用LLM生成一个带图形界面的程序
    (1)首先让AI给出代码
import socket
import threading
import tkinter as tk
from tkinter import scrolledtext, ENDdef encrypt(text, key=3):result = ""for char in text:result += chr(ord(char) + key)return resultdef decrypt(text, key=3):result = ""for char in text:result += chr(ord(char) - key)return resultclass ServerGUI:def __init__(self, root):self.root = rootself.root.title("加密聊天 - 服务端")self.root.geometry("550x500")self.chat_area = scrolledtext.ScrolledText(root, width=65, height=18)self.chat_area.pack(pady=10)self.chat_area.insert(END, "【系统】服务端已启动,等待客户端连接...\n")self.msg_entry = tk.Entry(root, width=50)self.msg_entry.pack(pady=5)self.send_btn = tk.Button(root, text="发送消息", command=self.send_msg)self.send_btn.pack(pady=5)self.conn = Nonethreading.Thread(target=self.start_server, daemon=True).start()def start_server(self):server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)HOST = "192.168.43.17"PORT = 2225server_socket.bind((HOST, PORT))server_socket.listen(1)self.conn, addr = server_socket.accept()self.chat_area.insert(END, f"【系统】已连接客户端:{addr}\n")while True:try:cipher = self.conn.recv(1024).decode("utf-8")if not cipher:breakplain = decrypt(cipher)self.chat_area.insert(END, f"\n【客户端】明文:{plain}\n【密文】{cipher}\n")self.chat_area.see(END)if plain == "exit":breakexcept:breakdef send_msg(self):msg = self.msg_entry.get().strip()if not msg or not self.conn:returncipher = encrypt(msg)self.chat_area.insert(END, f"\n【我】明文:{msg}\n【密文】{cipher}\n")self.conn.send(cipher.encode("utf-8"))self.chat_area.see(END)self.msg_entry.delete(0, END)if msg == "exit":self.conn.close()if __name__ == "__main__":root = tk.Tk()ServerGUI(root)root.mainloop()
import socket
import threading
import tkinter as tk
from tkinter import scrolledtext, ENDdef encrypt(text, key=3):result = ""for char in text:result += chr(ord(char) + key)return resultdef decrypt(text, key=3):result = ""for char in text:result += chr(ord(char) - key)return resultclass ClientGUI:def __init__(self, root):self.root = rootself.root.title("加密聊天 - 客户端")self.root.geometry("550x500")self.chat_area = scrolledtext.ScrolledText(root, width=65, height=18)self.chat_area.pack(pady=10)self.chat_area.insert(END, "【系统】正在连接服务端...\n")self.msg_entry = tk.Entry(root, width=50)self.msg_entry.pack(pady=5)self.send_btn = tk.Button(root, text="发送消息", command=self.send_msg)self.send_btn.pack(pady=5)self.client = Nonethreading.Thread(target=self.connect_server, daemon=True).start()def connect_server(self):self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)HOST = "192.168.43.17"PORT = 2225try:self.client.connect((HOST, PORT))self.chat_area.insert(END, "【系统】已成功连接服务端!\n")except:self.chat_area.insert(END, "【系统】连接失败!\n")returnwhile True:try:cipher = self.client.recv(1024).decode("utf-8")if not cipher:breakplain = decrypt(cipher)self.chat_area.insert(END, f"\n【服务端】明文:{plain}\n【密文】{cipher}\n")self.chat_area.see(END)if plain == "exit":breakexcept:breakdef send_msg(self):msg = self.msg_entry.get().strip()if not msg or not self.client:returncipher = encrypt(msg)self.chat_area.insert(END, f"\n【我】明文:{msg}\n【密文】{cipher}\n")self.client.send(cipher.encode("utf-8"))self.chat_area.see(END)self.msg_entry.delete(0, END)if msg == "exit":self.client.close()if __name__ == "__main__":root = tk.Tk()ClientGUI(root)root.mainloop()

(2)运行AI的代码
image
image
(3)生成程序的优点

  1. ** 带图形界面(GUI),操作简单直观 **
    不用敲命令行,点开就能用,输入文字点发送即可,任何人都能快速上手。
  2. ** 自动加密传输,聊天内容更安全 **
    采用字符偏移加密算法,网络上传输的是密文,不会直接暴露真实聊天内容。
  3. ** 明文、密文同时显示 **
    发送和接收时,界面会同时展示原始明文和加密后的密文,方便观察加密效果。
  4. ** TCP 可靠传输,消息不丢失 **
    基于 TCP 协议建立连接,传输稳定,适合局域网内一对一聊天。

⚠️ 三、实验过程中遇到的问题和解决过程

  • ❌ 问题1:服务端和客户端老是链接不上
    ✅ 解决方案:多次尝试,发现是IP不符、端口不对、WiFi连的不是同一个等等问题
  • ❌ 问题2:有的时候莫名报错
    ✅ 解决方案:,询问AI后,发现是一些东西没有安装,打开CMD,输入“pip install ”,安装对应模块

💡 四、其他(感悟、思考等)

本次《Python 程序设计》加密聊天系统实验,不仅是一次技术实操的锻炼,更是一场思维与能力的双重提升,让我对 Python 编程、网络通信以及问题解决有了更为深刻的认知与体会。
实验之初,我从最基础的 Socket 套接字编程入手,编写简单的客户端与服务端代码,实现了最基本的双向通信。看似简单的代码,却藏着诸多细节 ——IP 地址的配置、端口的选择、编码格式的统一,哪怕一个微小的失误,都可能导致 “ConnectionRefusedError” 这样的连接失败问题。

📖 五、参考资料

  • 📚 AI大模型的纠错以及一些问题的处理
  • 📚 Python Socket 网络编程实战教程 菜鸟教程:https://www.runoob.com/python/python-socket.html

📖 六、Gitee托管

本次实验代码已托管至Gitee
image
image

仓库链接:git -home

文件链接:服务端.py
文件链接:客户端.py
文件链接:AI服务端.py
文件链接:AI客户端.py

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

相关文章:

  • 从HC-05蓝牙模块到手机App控制:一个完整的STM32F103C8T6小车遥控项目搭建实录
  • FigmaCN:3分钟彻底告别英文界面,免费获取3800+设计师校验的中文翻译
  • LVGL项目内存告急?试试用外部Bin文件加载中文字体,给MCU省出几十KB
  • MWPhotoBrowser开源许可证合规终极指南:第三方库许可管理完整教程
  • 告别手动刷课!用Python+PyAutoGUI实现浙里学习视频自动播放(附完整源码)
  • cv_unet_image-colorization惊艳效果:同一场景不同年代照片色彩一致性处理
  • 终极GPU内存检测指南:MemtestCL深度解析与实战应用
  • ESP32新手避坑指南:Arduino常用函数从digitalWrite到millis()的实战详解
  • 别再全量微调了!LoRA、Adapter、Prefix-Tuning等PEFT方法保姆级入门指南
  • 对比不同模型在 TaoToken 平台上的响应速度主观感受
  • 抖音批量下载神器:3步实现免费无水印下载,效率提升90%
  • 深入 SwiftWork(第 0 篇):用 SwiftUI 构建一个 Agent 可视化工作台
  • 从Word到LaTeX的终极转换指南:docx2tex完整解决方案
  • [具身智能-533]:常见的中间件软件有哪些?
  • DoL-Lyra终极整合包:5分钟打造个性化游戏美化体验
  • 微信小程序逆向工程深度解析:wxappUnpacker技术实战指南
  • 微信好友智能检测:3步找出谁删了你,轻松管理社交关系
  • 终极指南:如何用llamafile实现LLM单文件分发与前端运行的完整方案
  • 2026年必备:高效降低AI率工具推荐,免费降AI率方法轻松搞定论文降AI - 降AI实验室
  • 2026年必备降AI指南:免费工具+改写技巧,一键拯救高AI率论文 - 降AI实验室
  • 【低轨卫星星载C程序功耗优化权威指南】:20年航天嵌入式专家亲授7大不可绕过的硬件协同降耗铁律
  • 8大网盘直链解析终极指南:一键获取真实下载地址告别限速烦恼
  • java后端开发学习
  • Rusted PackFile Manager:全面战争MOD开发的现代化革命
  • 实用话费充值卡回收技巧 - 京顺回收
  • 别再写UDF了!用Fluent表达式搞定出口温度控制入口流速的完整流程(附案例文件)
  • 微信通讯录隐形清理指南:如何发现并管理那些单向删除你的好友?
  • 高效实现B站缓存视频合并的完整解决方案:智能处理离线视频与弹幕挂载
  • 别再瞎调了!STM32F411时钟配置避坑指南:从HSI切换到HSE的完整流程与仿真验证
  • Phi-4-mini-reasoning快速部署:基于Docker Compose的多服务协同部署模板