20244323 实验三《Python程序设计》实验报告
20244323 2024-2025-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 2443
姓名: 张锐
学号:20244323
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课
一.实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
二. 实验过程及结果
- 真正的实验报告在这里,这份实验报告是额外的东西
- 设计数据传输形式,经过了一些思想斗争,选择了纯文本文件而不是XML文件格式传输数据
- 设计服务端程序,为了能在监听客户端消息的同时广播数据,使用了asyncio库
-
原本想的是能不能用多线程,但是好像这玩意的效果和我想的不太一样,经过查找资料知道了应该用异步来做
- 设计客户端程序,使用socket连接服务端,传输消息,接收广播数据
- 为客户端设计图形界面
-
就是一个模仿qq之类的聊天软件的图形界面,自己的消息和别人的消息分不同颜色显示,自己的名字显示为"Me",大概就这样,具体样式看下面的运行结果
- 最终运行效果截图:
![]()
- 代码在这里
三. 实验过程中遇到的问题和解决过程
- 问题1:由于设计的是一个网上多人聊天室,所以需要定期和客户端同步数据,然而如果同步间隔和客户端的接收间隔没有设置好,就会导致收到重复数据
- 问题1解决方案:我选择了不保存过往信息,这样就没事了
后来,我想到了只要我对收到的消息进行一次去重,那就可以避免这个问题了。
但是我懒得改了,因为我的那坨代码是我和这个问题几次较量后的权宜之计的产物,如果要改,工程量有点大
但是我还是把给列表去重的方法写在下面吧
#假设有一个列表l
l=[8,2,2,4,8,7,3,6,4,6,6,7,3,5,4,3,4,2,9]
#我想去掉里面重复的内容,且不打乱他们的相对顺序,即对于重复的元素,只保留第一个
#可以利用集合(set)里面元素不重复的性质来去重,但是set会给元素排序,所以我们转换回列表后还需要重新找到原来的顺序
unique_l=list(set(l))
#我们可以使用他们在原来列表中的索引作为关键字来排序,这样就能保证去重后的列表元素排序和原列表相同了
unique_l.sort(key=l.index)
#这样得到的unique_l列表里面的元素就是我们想要的结果了
- 问题2:为了用户体验,没办法在客户端运行过程中刷新来更新消息列表
- 问题2解决方案:使用了JS来实现添加消息的功能,具体情况如下:
每隔一定的时间,调用一下
update_page()函数(var int=self.setInterval("update_page()",200);)
update_page()这个异步函数会调用python里面的get_data()函数,更新消息列表,返回新消息
然后如果返回的内容符合消息的格式,就调用add_msg()函数来在HTML页面上创建新消息框

其他(感悟、思考等)
eel真的很方便我做图形界面,但是动态更新页面有的时候不太好做
我的大作业也打算用eel做图形界面了,比其他那些什么东西好玩多了


浙公网安备 33010602011771号