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

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

1.实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
要求1:
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求发送方输入内容,加密后并传输;接收方收到密文并解密和显示。要求:发方和收方同时输出明文和明文。
(3)程序代码托管到码云。
(4)添加文件操作,有加分。(可选项)
要求2:使用LLM生成一个带图形界面的程序
(1)分析关键代码的功能和使用方法
(2)分析生成程序的优点
(3)给出运行过程和结果截图
(4)程序代码托管到码云。

  1. 实验过程及结果
    实验过程:
    本实验采用 C/S(客户端/服务器)架构,基于 TCP 协议 实现可靠传输。核心逻辑分为网络通信建立与数据加密处理两个部分。
  2. 网络通信模块(Socket编程)
    (1)服务端设计思路:
    创建套接字:使用 socket.socket() 创建 TCP 套接字。
    绑定与监听:通过 bind() 绑定本机 IP 和端口(8887),调用 listen() 开启监听模式。
    接受连接:使用 accept() 阻塞等待客户端连接,建立连接后获取客户端套接字和地址。
    循环收发:进入 while 循环,利用 recv() 接收数据,处理后再通过 send() 回复数据。
    (2)客户端设计思路:
    创建与连接:创建套接字后,直接调用 connect() 主动连接服务端的指定 IP 和端口。
    交互循环:进入 while 循环,通过 input() 获取用户输入,加密后 send() 发送;随后调用 recv() 等待并接收服务端的回复。
  3. 数据加密模块(凯撒密码)
    加密逻辑:
    定义 caesar_encrypt(text, offset) 函数。
    遍历字符串中的每个字符,判断是否为字母。
    位移处理:利用 ord() 获取 ASCII 码,加上偏移量(3),通过模运算(% 26)实现循环位移,最后用 chr() 转回字符。非字母字符保持不变。
    解密逻辑:
    定义 caesar_decrypt() 函数,原理与加密相同,只需将偏移量设为相反数(-3)即可还原明文。
    (本人20244321李梓睿,搭档20244309黄至泓 ,代码中IP地址均有修改)
    实验结果截图(均已上传Gitee,且含加密):
    ⑴服务端
    代码:
    image
    image
    结果:
    image
    ⑵客户端
    代码:
    image
    image
    结果:
    image
    ⑶将地址改为学号(20244321)
    image
    image
    ⑷LLM生成
    代码对比分析:
  4. 交互体验升级:LLM生成的代码引入了图形界面,用户无需命令行即可通过按钮和文本框进行操作,避免了输入错误。
  5. 并发处理能力:LLM代码使用 threading 多线程技术,实现了发送与接收的并行处理,保证了聊天的流畅性。
    代码:
    服务端:
    image
    image
    image
    结果:
    image
    客户端:
    image
    image
    image
    结果:
    image
  6. 实验过程中遇到的问题和解决过程
  • 问题1:大小写区分问题:起初未区分字母大小写,统一处理导致大写字母解密后变为小写。
  • 问题1解决方案:利用 isupper() 判断,分别设定 'A' 和 'a' 为基准进行独立的模运算,确保大小写格式一致。
  • 问题2:连接被拒报错:先启动客户端时程序报错,因为服务端还没运行,连接被拒绝。
  • 问题2解决方案:严格按照“先启动服务端,再启动客户端”的顺序操作,确保连接目标存在。

其他(感悟、思考等)
通过本次Socket编程实验,我深刻体会到网络通信中协议规范与细节处理的重要性。在实现凯撒加密时,最初因未区分大小写导致解密错误,这让我明白字符编码处理需严谨考虑各种边界情况;而端口占用的报错则教会我系统资源管理的必要性。
对比自写的命令行程序与LLM生成的含图形界面版本,我认识到优秀的程序不仅要实现核心功能,更要注重用户体验与代码的可扩展性。这次实验不仅锻炼了我的编程能力,更让我理解了从“功能实现”到“工程化开发”的思维转变。

参考资料

posted @ 2026-04-28 20:13  遥辉残响  阅读(19)  评论(1)    收藏  举报