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

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

课程:《Python程序设计》
班级:2542
姓名:王一婷
学号:4202
实验教师:王志强
实验日期:2026年4月30日
必修/选修: 专选课

1.实验内容

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

2. 实验过程及结果

要求1:
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求发送方输入内容,并传输;接收方收到信息并显示。
(1.)修改IP地址
e6e2a734299849c2023bdc815a968986
(2.)创建客户端,20254202王一婷192.168.1.2(客户端)与20254224张子菡(服务端)进行通讯
代码如下
image
通讯过程
a46a3e5502e137013f6c5da4812ad28c
(3.)创建服务端,20254202王一婷(服务端)与20254224张子菡192.168.1.24(客户端)进行通讯
代码如下
34fb7dc368c296c1960813d71395d232
通讯过程
d79aae3aee884cb886c31b5431c256cd
要求2:使用LLM生成一个带图形界面的程序
(1)分析关键代码的功能和使用方法
(2)分析程序的优点
(3)给出运行过程和结果截图
(1.)
①代码分析
import socket
import threading
import tkinter as tk
from tkinter import scrolledtext, messagebox
from datetime import datetime
这一步提供程序运行的所有基础工具

class SocketChatGUI:
def init(self, root):
self.root = root
self.root.title("Socket 图形通信程序")
self.root.geometry("550x500")

self.mode = tk.StringVar(value="server")
self.host = tk.StringVar(value="127.0.0.1")
self.port = tk.IntVar(value=8888)

self.server_socket = None
self.conn = None
self.is_run = False

self.build_ui()
这一步主要是初始化窗口大小,标题的。

def build_ui(self):
# 控制区域
frame1 = tk.Frame(self.root)
frame1.pack(pady=5)
tk.Radiobutton(frame1, text="服务端", variable=self.mode, value="server").pack(side=tk.LEFT,padx=10)
tk.Radiobutton(frame1, text="客户端", variable=self.mode, value="client").pack(side=tk.LEFT,padx=10)

frame2 = tk.Frame(self.root)
frame2.pack(pady=5)
tk.Label(frame2,text="IP:").pack(side=tk.LEFT)
tk.Entry(frame2,textvariable=self.host,width=20).pack(side=tk.LEFT)
tk.Label(frame2,text="端口:").pack(side=tk.LEFT)
tk.Entry(frame2,textvariable=self.port,width=8).pack(side=tk.LEFT)

frame3 = tk.Frame(self.root)
frame3.pack(pady=5)
self.btn_start = tk.Button(frame3,text="启动",command=self.start_link,bg="green",fg="white")
self.btn_start.pack(side=tk.LEFT,padx=5)
self.btn_stop = tk.Button(frame3,text="断开",command=self.close_link,bg="red",fg="white")
self.btn_stop.pack(side=tk.LEFT,padx=5)

聊天框

self.text_box = scrolledtext.ScrolledText(self.root,width=60,height=18)
self.text_box.pack(pady=5)
self.text_box.config(state="disabled")

发送框

frame4 = tk.Frame(self.root)
frame4.pack(pady=5,fill="x")
self.entry_msg = tk.Entry(frame4,width=50)
self.entry_msg.pack(side=tk.LEFT,fill="x",expand=True)
self.btn_send = tk.Button(frame4,text="发送",command=self.send_msg,bg="#0099ff",fg="white")
self.btn_send.pack(side=tk.RIGHT)
self.btn_send.config(state="disabled")
这一部分制作面板的各种按钮和框,规划区域

def log(self,msg):
self.text_box.config(state="normal")
now = datetime.now().strftime("%H:%M:%S")
self.text_box.insert(tk.END,f"[{now}] {msg}\n")
self.text_box.see(tk.END)
self.text_box.config(state="disabled")
这一部分是统一处理状态信息的

def start_link(self):
h = self.host.get()
p = self.port.get()
if self.mode.get() == "server":
try:
self.server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
self.server_socket.bind((h,p))
self.server_socket.listen(1)
self.is_run = True
self.log(f"服务端已启动,监听 {h}:{p}")
threading.Thread(target=self.accept_loop,daemon=True).start()
except Exception as e:
messagebox.showerror("错误",str(e))
else:
try:
self.conn = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.conn.connect((h,p))
self.is_run = True
self.log(f"成功连接服务端 {h}:{p}")
threading.Thread(target=self.recv_loop,daemon=True).start()
self.btn_send.config(state="normal")
except Exception as e:
messagebox.showerror("错误",str(e))
self.btn_start.config(state="disabled")
这一部分规范点对点聊天,只能加入一个客户端

def accept_loop(self):
while self.is_run:
try:
self.conn,addr = self.server_socket.accept()
self.log(f"已连接客户端:{addr}")
self.btn_send.config(state="normal")
threading.Thread(target=self.recv_loop,daemon=True).start()
break
except:
break

def recv_loop(self):
while self.is_run:
try:
data = self.conn.recv(1024)
if not data:
self.log("对方已断开连接")
break
text = data.decode("utf-8")
self.log(f"对方:{text}")
except:
break
这一部分是接收消息

def send_msg(self):
text = self.entry_msg.get().strip()
if not text:
return
try:
self.conn.send(text.encode("utf-8"))
self.log(f"我:{text}")
self.entry_msg.delete(0,tk.END)
except:
messagebox.showerror("失败","消息发送失败")
这一部分是发送消息的
def close_link(self):
self.is_run = False
if self.conn:
self.conn.close()
if self.server_socket:
self.server_socket.close()
self.log("连接已断开")
self.btn_start.config(state="normal")
self.btn_send.config(state="disabled")

if name == "main":
root = tk.Tk()
app = SocketChatGUI(root)
root.mainloop()
这一部分是安全断开链接的代码
②使用方法:
复制完整代码,运行弹出面板,双方输入同一个IP地址,自定义端口,各自选择客户端或者服务端点启动按钮。弹出成功连接服务端字样后可以进行互动。需要角色互换时点击断开,重新选择客户端或者服务端。
(2.)优点:
1)服务端客户端一体化设计,调试便捷
2)界面运行流畅不卡顿
3)可以实现点对点通信,功能闭环
4)结构清晰,易于维护
(3.)运行情况如下:
20254202王一婷(客户端)与20254224张子菡(服务端)进行通讯
9609bb2c829f2178eb583389723f9d37
20254202王一婷(服务端)与20254224张子菡(客户端)进行通讯
d52d2fe04c11a4fd1684774234bba2e0

3. 实验过程中遇到的问题和解决过程

  • 问题1:一开始连接不上
  • 问题1解决方案:询问老师后关闭防火墙
  • 问题2:关闭防火墙后连不上网,无法进行实验
  • 问题2解决方案:将手机上的热点连接到的教室WiFi改成流量就好了
  • 问题3:完成实验后电脑连不上网
  • 问题3解决方案:将个人热点的IP地址改成原来的自动连接就好了

其他(感悟、思考等)

今天完成了 Socket 网络通信实验。刚开始在修改 IP 地址、和同学建立远程连接的过程中遇到不少阻碍,问题频发:比如IP配置填写有误、电脑防火墙未关闭拦截了通信端口,还有服务端与客户端 IP 地址不匹配等情况,导致一直无法正常连通。之后我主动向老师和同学请教排查思路,逐一排查并解决了上述问题,最终成功搭建通信链路,顺利跑通实验程序,完成了基础实验任务。借助大模型编写程序时,我通过调整优化指令描述,重新生成并完善代码,修改本机与互联 IP 配置后,程序可以稳定收发数据,圆满完成实验要求。整体来看,本次实验过程虽一波三折,但在排错、请教、修改代码的过程中收获了很多实操经验,对 Socket 通信原理和网络配置有了更深刻的理解。

参考资料

posted @ 2026-04-30 22:05  王一婷20254202  阅读(19)  评论(1)    收藏  举报