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

学号 2025-2026-2 《Python程序设计》实验三报告

课程:《Python程序设计》
班级:2541
姓名: 李若涵
学号:20254101
实验教师:王志强
实验日期:2026年4月28日
必修/选修: 专选课

1.实验内容

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

2. 实验过程及结果

实验内容一:

(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;

(2)要求发送方输入内容,并传输;接收方收到信息并显示。
e3b1218989cb8cf5de47f317e37b3cd4
我与20254111周笑凡同学进行信息互传,上图周笑凡同学为服务端,我为客户端
dd2b328cfd12a8a363e9d79b37abc640
我与20254111周笑凡同学进行信息互传,上图周笑凡同学为客户端,我为服务端(注:因ip末尾地址为1与网关冲突,故末尾值为101)
实验内容二:
使用LLM生成一个带图形界面的程序

(1)分析关键代码的功能和使用方法
①接受客户端连接(accept_connections 线程)
client_socket, client_addr = self.server_socket.accept()
client_thread = threading.Thread(target=self.handle_client, args=(client_socket, client_addr), daemon=True)
client_thread.start()
功能:调用 accept() 等待新连接;每连接一个客户端,就创建一个新线程去处理该客户端的通信。
使用方法:服务器启动后自动运行,无需额外操作。
②广播消息(broadcast)

def broadcast(self, message, sender_socket=None, exclude_nickname=None):
with self.clients_lock:
for client in self.clients[:]:
if sender_socket and client['socket'] == sender_socket:
continue
if exclude_nickname and client['nickname'] == exclude_nickname:
continue
client['socket'].sendall((message + "\n").encode('utf-8'))
功能:向所有在线客户端发送消息。
使用方法:当收到客户端聊天消息、用户加入或离开、服务器广播时自动调用。
③ 发送普通消息
self.client_socket.sendall((message + "\n").encode('utf-8'))
功能:将用户输入的消息加上换行符后发送给服务器。
使用方法:在底部输入框输入文字,按回车或点击“发送”按钮。
(2)分析生成程序的优点
①程序里加了各种超时和异常处理。比如客户端连服务器,设了3秒连接超时,不会因为连不上就让窗口显示未响应。。收发数据时断网或者对方突然关掉,也能抓住异常清理掉这个客户端,不会留下僵尸连接。
②昵称处理方便。客户端可以自选名字,服务器自动检查重名,发现有重名就在后面加个数字,保证每个人身份唯一。
③在线列表是实时刷新的。客户端右边框不用手动刷新,服务器界面列表会显示地址,便于排查问题。消息格式上带了时间戳,自己和别人的消息颜色区分,系统消息也单独标记。服务器广播会有特殊标志,比如“[管理员] 广播:……”,比较醒目。
(3)给出运行过程和结果截图
a0a0c71a00be025c51a2a29579c17ab6
上图我为服务端,周笑凡同学为客户端
image
上图我为客户端,周笑凡同学为服务端

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

  • 问题1:实验一中我与周笑凡同学在连接同一个网络,填入ip地址运行程序后结果错误
  • 问题1解决方案:
    经老师指导,发现选择的ip地址错误,在ip选择中应选择无线局域网WLAN栏的ipv4,且笑凡同学装了两个防火墙,双方难以互通。
  • 问题2:实验二中我在当客户端时发现我的端口一直显示未响应,而对方接口正常,消息难以互通。
  • 问题2解决方案:
    我询问deepseek后,要求它在原代码基础上对Socket的连接过程设置一个较短的超时时间,这样如果连接不上,就会立即抛出 socket.timeout 异常,GUI 就不会卡死了。此外,接收线程中也建议设置一个较小的超时,以便能够及时响应退出请求。

其他(感悟、思考等)

学习这个聊天程序时,反复折腾线程同步与界面卡顿,才勉强跑通。反观日常用的微信、QQ它们要处理弱网、消息漫游、安全加密等等系统性问题。这个练手的小程序让我看清了自己与工业级产品的差距,也明白了再复杂的系统也是从这些基础通信一步步构建出来的。

参考资料

-  [《Python程序设计》]

posted @ 2026-05-11 19:16  秉烛27  阅读(8)  评论(0)    收藏  举报