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

20244323 2024-2025-2 《Python程序设计》实验三报告

课程:《Python程序设计》
班级: 2443
姓名: 张锐
学号:20244323
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课

一.实验内容

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

二. 实验过程及结果

  1. 真正的实验报告在这里,这份实验报告是额外的东西
  2. 设计数据传输形式,经过了一些思想斗争,选择了纯文本文件而不是XML文件格式传输数据
  3. 设计服务端程序,为了能在监听客户端消息的同时广播数据,使用了asyncio库
  • 原本想的是能不能用多线程,但是好像这玩意的效果和我想的不太一样,经过查找资料知道了应该用异步来做

  1. 设计客户端程序,使用socket连接服务端,传输消息,接收广播数据
  2. 为客户端设计图形界面
  • 就是一个模仿qq之类的聊天软件的图形界面,自己的消息和别人的消息分不同颜色显示,自己的名字显示为"Me",大概就这样,具体样式看下面的运行结果

  1. 最终运行效果截图:
  2. 代码在这里

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

  • 问题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做图形界面了,比其他那些什么东西好玩多了

参考资料

posted @ 2025-04-16 23:50  awcyvan  阅读(49)  评论(0)    收藏  举报