PyQt5+socket+多线程,实现简单聊天室

之前从没想过自己设计一套网络聊天室出来 , 但网络原理实验的时候老师说:"谁做出来了,就给谁加分",于是我(内卷王)又开始(偷偷地背着全班同学)自己做起了这一个实验项目 。实验项目的主要要求简单明了 , 就是"能互相通信" , "有界面" , 说着轻巧 , 做起来可不简单 , 花了我三天时间才肝出来 。
1.聊天室功能:
2.聊天室的实现原理
3.连接测试
3.1 本地连接测试
3.2 跨网段连接测试
4.聊天室关键代码解释
5.完整代码
6.大坑提醒
7.结束语
1.聊天室功能:
(1) 不同客户端之间能够通过服务端转发实现相互通信
(2) 客户端和服务端均采用多线程处理工作
(3) 具有简单明了 , 排版整洁的图形化界面
2.聊天室的实现原理
库:基于库提供的远程通信函数 , 实现远程通信 , 基础函数如下:
.(.,.)
.# 使用IPv4
.# 基于TCP的提供有保障的面向连接的服务
设定完通信协议后服务端使用bind函数绑定本机IP和端口(即套接字)
.bind((ip,port))# ip为服务端ip地址 , 端口为设定的开放端口
客户端指定好ip和端口后通过函数与服务端建立连接:
.((ip,port))
连接成功后客户端和服务端可以互相通过send和recv函数发送和接受消息 。
==============================================================
多线程处理:基于PyQt5自带的类和特有且好用的
基于PyQt5提供的类为服务端开通多个客户端监听线程 , 负责实现多个线程与主线程的异步消息传输 。一开始服务端主线程开启一个监听线程监听客户端连接请求并维持会话 , 一旦有监听线程连接到客户端后开启一个新的监听线程监听下一个可能存在的客户端请求 。当监听线程接收到各自的客户端发来的消息之后 , 使用向主线程发送信号 , 主线程接收到信号后向全体客户端广播内容 。
3.连接测试3.1 本地连接测试
为什么?要是本地连接测试都不行 , 就别指望不同主机之间连接了.... , 首先分别设定好服务端和客户端输入IP和端口后,服务端先点击建立服务器 , 然后客户端在点击连接服务器 。
【PyQt5+socket+多线程,实现简单聊天室】连接成功后客户端向服务端发送消息 , 服务端向客户端回复消息 , 连接测试成功!!!
3.2 跨网段连接测试
在腾讯云上租了一个服务器 , 然后将自己的服务端代码放在了上面,使用两台电脑连接外网服务器并相互通信 。(服务器IP就不透露了)
不同网段之间的连接测试成功!!!
4.聊天室关键代码解释
服务端实例(主线程)
广播消息函数:当接受到消息的时候触发该函数 , 通过遍历线程列表依次将消息按顺序发送给每个客户端 , 如果发送失败就断开与该客户端的连接
def bordCastInfo(self,info):print(len(self.serverDict))for client in self.serverDict:try:if self.serverDict[client].clientsocket != None:print("尝试将信息广播出去")self.serverDict[client].sendToClient(info)# 将消息传入指定的客户端print("广播成功")except Exception as reason:self.getFlag("@@@".join([client,"disconnect"]))# 运行函数,停止某个客户端的监听(相当于关闭)print("服务端",reason)
连接状态绑定的槽函数,如果发来的消息是成功的 , 则开启一个新的监听线程线程 , 否则设定监听线程运行转态为False,然后子线程自主结束 。