20254111 2025-2026-2 《Python程序设计》实验3报告
课程:《Python程序设计》
班级:2541
姓名:周笑凡
学号:20254111
实验教师:王志强
实验日期:2026年4月28日
必修/选修:专选课
1.实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
2. 实验过程及结果
要求1:
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求发送方输入内容,并传输;接收方收到信息并显示。
我(20254111)作为服务端:

控制台:

我作为客户端(服务端为20254101):

控制台:

要求2:使用LLM生成一个带图形界面的程序
(1)分析关键代码的功能和使用方法
- 类初始化 (init)
def init(self):
self.client_socket = None # 客户端socket连接
self.receiving = False # 接收消息标志
self.receive_thread = None # 接收线程
self.my_nickname = "" # 当前昵称
作用: 初始化所有状态变量,创建GUI界面,设置默认值(端口:12345,并能自动生成昵称) - 消息显示 (log_message)
def log_message(self, msg, msg_type="info"):
timestamp = datetime.now().strftime("%H:%M:%S") # 根据消息类型格式化
if msg_type == "system": # 系统消息
elif msg_type == "me": # 自己发送的消息
elif msg_type == "received": # 接收的消息
使用方法:①自动调用,无需手动调用②显示带时间戳的消息到聊天区域 - 接收消息 (receive_messages)
def receive_messages(self):
buffer = "" # 粘包处理缓冲区
while self.receiving:
data = self.client_socket.recv(1024).decode('utf-8')
buffer += data
while "\n" in buffer: # 按行处理
line, buffer = buffer.split("\n", 1)
if line.startswith("/online "): # 特殊指令
self.update_online_list(line)
else:
self.log_message(line, "received")
作用:①粘包处理: buffer机制防止消息被截断②协议解析: 识别/online指令更新用户列表③异常处理: 断开时自动清理 - 发送消息 (send_message)
def send_message(self):
message = self.message_entry.get().strip()
self.log_message(message, "me") # 本地立即显示
self.client_socket.sendall((message + "\n").encode('utf-8'))
特点:①本地立即显示(服务器不会转发回来,避免重复)②每条消息末尾加换行符作为分隔符 - 修改昵称 (change_nickname)
def change_nickname(self):
new_nick = simpledialog.askstring("修改昵称", "请输入新昵称:")
self.client_socket.sendall(f"/nick {new_nick}\n".encode('utf-8'))
使用方法: ①点击"修改昵称"按钮②弹出对话框输入新昵称③发送/nick命令
(2)分析生成程序的优点
- 网络通信健壮
①用缓冲区解决了TCP粘包问题,消息不会乱码或合并
②接收消息用独立线程,发消息和聊天界面互不卡顿
③连接断了能自动检测并提示,不会莫名其妙退出 - 界面交互友好
①连接成功后自动禁用IP、端口输入框,防止误操作
②修改昵称不用重连,点按钮弹窗输入就行
③自己发的消息左边显示"我:",别人发的显示昵称,一眼能分清 - 代码结构清晰
①连接、接收、发送、界面更新都分成了独立函数
②用root.after()保证多线程下界面更新不会崩溃
③关闭窗口时会自动断开连接并释放资源 - 容错性高
①输入端口不是数字、服务器没开、网络超时都有对应提示
②不会因为用户输错或者网络波动就整个程序卡死
(3)给出运行过程和结果截图
我(20254111周笑凡)作为客户端(服务端为20254101):


我(20254111周笑凡)作为服务端:


3. 实验过程中遇到的问题和解决过程
- 问题1:在使用老师给我们提供的代码,我做客户端的时候一直和我的合作伙伴(20254101同学)一直连不上,要么就是连上之后她的运行栏上面不能显示出那个绿色的“我:”。
- 问题1解决方案:我们去找老师解决。最后发现她的IP改错了,然后我开了防火墙。老师帮我们调试好了电脑,其中还改了“port”的范围。最后我们俩成功连接上了。
- 问题2:在用大模型写出的代码,我作为服务端时,我们俩又连接不上了。
- 问题2解决方案:最后发现又是因为我防火墙开了,关闭之后就成功连接上了。
其他(感悟、思考等)
我觉得这次这个实验特别神奇。尤其是当两个人成功连接上进行对话的时候,感觉体会到了第一个接到有线电话的那个人的心情。不过这个实验中也是困难重重啊,虽然这次老师直接给我们提供了现成代码,但是我们在连接的时候还是没有很顺利。
在课后用大模型写代码做实验的时候,也是体会到凡事不是一口气就能做成的。我和我的实验搭子不断的修改指令直到最终生成的代码能符合我们的要求。
总之,这次实验可以用新奇来形容。每次我们俩连接上的时候都无比的激动,也是在这个过程中进一步体会到Python的魅力了。
参考资料
- [《零基础学Python》]
(https://pan-yz.cldisk.com/external/m/file/ebeadceffe1bf5812590a4f975e08c16) - [《Python程序设计》]
