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

20254218 2025-2026-2 《Python程序设计》实验3报告

20254218 2025-2026-2 《Python程序设计》实验3报告
课程:《Python程序设计》
班级:2542
姓名:王兴聪
学号:20254218
实验教师:王志强
实验日期:2026年4月11日
必修/选修:专选课

1.实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。

  1. 实验过程及结果
    要求1:
    (1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
    (2)要求发送方输入内容,并传输;接收方收到信息并显示。
    我(20254218王兴聪)作为服务端:

屏幕截图 2026-05-11 215624
我作为客户端(服务端20244218)

屏幕截图 2026-05-11 215414

要求2:使用LLM生成一个带图形界面的程序

屏幕截图 2026-05-11 221935
(1)大模型生成的客户端代码:
import socket
import base64
import tkinter as tk
from tkinter import scrolledtext, messagebox

KEY = "12345678"
PORT = 12345
client_socket = None

加密解密

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

连接服务端

def connect_server():
global client_socket
ip = entry_ip.get().strip()
if not ip:
messagebox.showwarning("提示", "请输入服务端IP!")
return
try:
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((ip, PORT))
text_box.insert(tk.END, "✅ 已连接服务端\n")
# 开启接收线程
import threading
threading.Thread(target=recv_msg, daemon=True).start()
except Exception as e:
messagebox.showerror("连接失败", f"无法连接:{e}")

接收消息

def recv_msg():
global client_socket
while True:
try:
data = client_socket.recv(1024).decode()
if not data:
text_box.insert(tk.END, "❌ 服务端已断开\n")
client_socket.close()
break
plain = decrypt(data)
text_box.insert(tk.END, f"【收到明文】{plain}\n【收到密文】{data}\n")
text_box.see(tk.END)
except:
break

发送消息

def send_msg():
global client_socket
if not client_socket:
messagebox.showwarning("提示", "请先连接服务端!")
return
msg = entry_msg.get().strip()
if not msg:
return
cipher = encrypt(msg)
client_socket.send(cipher.encode())
text_box.insert(tk.END, f"【发送明文】{msg}\n【发送密文】{cipher}\n")
entry_msg.delete(0, tk.END)
text_box.see(tk.END)

搭建界面

root = tk.Tk()
root.title("加密聊天 - 客户端")
root.geometry("600x450")

IP输入框

tk.Label(root, text="服务端IP:").place(x=20, y=15)
entry_ip = tk.Entry(root, width=40)
entry_ip.place(x=90, y=15)
tk.Button(root, text="连接", command=connect_server).place(x=420, y=12)

聊天显示框

text_box = scrolledtext.ScrolledText(root, width=70, height=20)
text_box.place(x=20, y=50)

消息输入框

tk.Label(root, text="发送消息:").place(x=20, y=400)
entry_msg = tk.Entry(root, width=50)
entry_msg.place(x=90, y=400)
tk.Button(root, text="发送", command=send_msg).place(x=420, y=397)

root.mainloop()
(2)生成的服务端代码:
import socket
import base64
import tkinter as tk
from tkinter import scrolledtext, messagebox
import threading

KEY = "12345678"
PORT = 12345
conn = None
server_socket = None

加密解密(和客户端一致)

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

启动服务端

def start_server():
global server_socket, conn
try:
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(("0.0.0.0", PORT))
server_socket.listen(1)
text_box.insert(tk.END, f"✅ 服务端已启动,监听端口 {PORT},等待客户端连接...\n")

    # 等待客户端连接def accept_conn():global connconn, addr = server_socket.accept()text_box.insert(tk.END, f"✅ 客户端已接入:{addr}\n")# 接收消息线程threading.Thread(target=recv_msg, daemon=True).start()threading.Thread(target=accept_conn, daemon=True).start()
except Exception as e:messagebox.showerror("启动失败", f"错误:{e}")

接收客户端消息

def recv_msg():
global conn
while True:
try:
data = conn.recv(1024).decode()
if not data:
text_box.insert(tk.END, "❌ 客户端已断开连接\n")
conn.close()
break
plain = decrypt(data)
text_box.insert(tk.END, f"【收到明文】{plain}\n【收到密文】{data}\n")
text_box.see(tk.END)
except:
break

发送消息给客户端

def send_msg():
global conn
if not conn:
messagebox.showwarning("提示", "暂无客户端连接!")
return
msg = entry_msg.get().strip()
if not msg:
return
cipher = encrypt(msg)
conn.send(cipher.encode())
text_box.insert(tk.END, f"【发送明文】{msg}\n【发送密文】{cipher}\n")
entry_msg.delete(0, tk.END)
text_box.see(tk.END)

搭建界面

root = tk.Tk()
root.title("加密聊天 - 服务端")
root.geometry("600x450") # 已修复!

tk.Button(root, text="启动服务端", command=start_server).place(x=20, y=15)

聊天日志框

text_box = scrolledtext.ScrolledText(root, width=70, height=20)
text_box.place(x=20, y=50)

消息输入

tk.Label(root, text="回复消息:").place(x=20, y=400)
entry_msg = tk.Entry(root, width=50)
entry_msg.place(x=90, y=400)
tk.Button(root, text="发送", command=send_msg).place(x=420, y=397)

root.mainloop()

(3)给出运行过程和结果:
屏幕截图 2026-05-11 220843

屏幕截图 2026-05-11 220954

(4)LLM生成代码的优点:
1.核心功能:实现 TCP 加密通信,异或 + Base64 保证数据传输安全,图形界面操作简单便捷;
2.技术亮点:多线程处理消息接收,界面不卡顿;固定端口,简化配置;
3.适用场景多:局域网内安全消息传输、加密通信学习与测试。

(5)遇见的问题
问题:在用大模型写出的代码,我作为服务端时,我们俩又连接不上了。
问题的解决方案:最后发现又是因为我防火墙开了,关闭之后就成功连接上了。

其他(感悟、思考等)
做这个实验中困难很多,通过同学的帮助写代码,这个部分进展得很快,但是我们在连接的时候还是不算很顺利。
在课后用大模型写代码做实验的时候,也是体会到凡事不是一口气就能做成的。我和我的实验搭子不断的修改指令直到最终生成的代码能符合我们的要求。
总之,这次实验比之前的实验要更有吸引力,更加神奇,没想到还能通话。

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

相关文章:

  • Ice:macOS菜单栏终极管理方案,让你的桌面瞬间清爽高效
  • FanControl完整指南:3步掌握Windows风扇控制,告别噪音烦恼
  • 如何快速掌握HunterPie:5步实现《怪物猎人世界》智能狩猎监控
  • 2026桥式称重传感器10大排行,广东犸力口碑享誉行业 - 品牌速递
  • TMS320C6678 多核中断与IPC实战:从事件路由到核间通信的代码剖析
  • 半导体IP产业变革:从EDA历史看IP组装业务的未来
  • 2026年昆明美术集训3人团特价集训课: - 云南美术头条
  • YOLOv11 改进 - 注意力机制 LRSA局部区域自注意力( Local-Region Self-Attention) 轻量级局部上下文建模弥补长程依赖细节不足 CVPR2025
  • 2026国产称重传感器10大排行,广东犸力国货精工领跑行业 - 品牌速递
  • YOLOv11 改进 - 注意力机制 LS-YOLO MSFE 多尺度特征提取模块:并行分支结构增强多尺度感知,优化遥感与小目标检测
  • 别再只会用Excel了!用MATLAB的table处理5000行数据,效率提升不止一点点
  • MILCOM 2011技术风向:软件定义无线电、GaN与宽带测试的军用射频演进
  • 2026注液电子秤高精度称重传感器十大品牌,广东犸力实力上榜 - 品牌速递
  • 从PLY到3D视图:手把手教你用PCL Visualizer定制点云显示效果
  • MacOS升级指定版本系统 - Leonardo
  • YOLOv11 改进 - 注意力机制 HaloNet 局部自注意力 (Local Self-Attention) 以分块交互策略实现高效全局上下文建模
  • 2026平行梁式称重传感器十大品牌,广东犸力工业称重优选品牌 - 品牌速递
  • Claude 3.5 Sonnet重磅升级(开发者必看的3个隐藏API调用技巧)
  • Prometheus 自定义指标监控:Python Exporter 编写与业务指标告警配置
  • YOLOv11 改进 - 注意力机制 IIA信息整合注意力(Information Integration Attention ):精准保留空间位置信息,平衡精度与计算成本 TGRS2025
  • windows系统安装wsl安装opencode教程
  • YOLOv11 改进 - 注意力机制 iRMB 倒置残差移动块:硬件感知优化破解计算瓶颈,提升小目标检测鲁棒性
  • Pix2Text ONNX模型文件缺失问题深度解析与完整解决方案指南
  • 智能家居信任危机:从安全隐私到开放标准的产业转型之路
  • 莱迪思Power Manager芯片:可编程电源管理方案解析与应用
  • P16434 [APIO 2026 中国赛区] 蛋糕 个人题解
  • 2026高精度称重传感器十大品牌,广东犸力稳居行业标杆 - 品牌速递
  • 如何让Windows 11运行如新:Win11Debloat终极优化指南
  • ESP32 WROVER模组4MB PSRAM保姆级配置指南:从menuconfig到分区表避坑
  • Codex客户端Mac低版本安装解决方法