admin管理员组文章数量:1576365
最近网络协议课程需要利用所学知识自己设计了一个与网络协议有关的课程设计,由于时间比较赶本人选择了较为简单的Tcp通信协议,利用python PyQt5开发了一个仿QQ。
新版连接(新增了一些功能):python仿QQ_m0_37876057的博客-CSDN博客针对之前很多同学问我这个可不可不支持数据库及增加注册功能,我增加了这些功能,本软件基于python gui图形库pyqt5编写的仿qq,采用mysql数据库存储,socket通信(tcp协议)实现,支持多账号登录,注册,单人私聊,群聊,添加好友分组等功能。源码下载:基于Tcpsocket通信的Pyqt5仿QQ-Python文档类资源-CSDN下载基于Tcpsocket通信的Pyqt5仿QQ,增加支持数据库,qq,登录,注册,群聊功能更多下载资源、学习资料请访问CSDN下载频道.https://downlhttps://blog.csdn/m0_37876057/article/details/120243182
仿QQ运行效果如下
登录界面:
主界面:
聊天界面:
个人聊天:
群聊:
原理解析:
基于tcp协议,编写开发服务端和客户端,客户端即仿QQ.利用tcp三次握手建立连接通信,互相发送信息。利用多线程原理实现多连接通信即多人聊天。运行时要先开启服务端,然后运行客户端QQ与服务器建立连接,服务端保存通信连接并做好标识。QQ发送信息时根据标识找到连接发送信息到指定用户。
tcp协议原理图:
服务端源码如下:
from socket import *
import threading
#创建socket套接字,开启循环监听
address='127.0.0.1'
port=6337
buffsize=1024
s = socket(AF_INET, SOCK_STREAM)
s.bind((address,port))
s.listen(10) #最大连接数
#建立登录用户列表,群聊列表
client_list=[]
user_list=[[2097557613,123456],[2097557614,123456],[2097557615,123456],[2097557616,123456],[2097557617,123456],[2097557618,123456]]
user_l=len(user_list)
user_client=[]
group_list=[['tcp群'],['兼职群'],['同学群'],['学习资料群']]
#登录处理方法
def login(logindata,clientsock):
for x in range(0,user_l):
print("登录请求"+str(logindata[1]))
if len(user_client)>=1:
ul=len(user_client)
if str(user_list[x][0])==str(logindata[1]) and str(user_list[x][1])!=str(logindata[2]):
login_bkinfo = 'flase-pw'
clientsock.send(login_bkinfo.encode())
break
elif str(user_list[x][0])==str(logindata[1]) and str(user_list[x][1])==str(logindata[2]):
for user_cl in range(0, ul):
if str(user_client[user_cl][0]) == str(logindata[1]):
login_bkinfo = 'flase-login'
clientsock.send(login_bkinfo.encode())
break
elif user_cl == ul - 1:
usercl=[]
usercl.append(logindata[1])
usercl.append(clientsock)
login_bkinfo = 'true'
user_client.append(usercl)
print(user_client)
clientsock.send(login_bkinfo.encode())
break
elif x==user_l-1:
login_bkinfo = 'flase-user'
clientsock.send(login_bkinfo.encode())
else:
if str(user_list[x][0])==str(logindata[1]) and str(user_list[x][1])!=str(logindata[2]):
login_bkinfo = 'flase-pw'
clientsock.send(login_bkinfo.encode())
break
elif str(user_list[x][0])==str(logindata[1]) and str(user_list[x][1])==str(logindata[2]):
usercl=[]
usercl.append(logindata[1])
usercl.append(clientsock)
login_bkinfo = 'true'
user_client.append(usercl)
print(user_client)
clientsock.send(login_bkinfo.encode())
break
elif x==user_l-1:
login_bkinfo = 'flase-user'
clientsock.send(login_bkinfo.encode())
#tcp多连接处理,消息识别处理
def tcplink(clientsock,clientaddress):
group_l = len(group_list)
while True:
recvdata=clientsock.recv(buffsize).decode('utf-8')
logindata=recvdata.split(' ')
print(logindata)
if str(logindata[0])=='login':
login(logindata,clientsock)
elif str(logindata[0])=='wechat_req':
#reqci=1
for y in range(0,group_l):
if str(group_list[y][0])==str(logindata[1]):
requser=str(logindata[2])+' '+'加入'
group_list[y].append(clientsock)
groupl=len(group_list[y])
if groupl>2:
for h in range(1,groupl):
group_list[y][h].send(requser.encode())
else:
clientsock.send(requser.encode())
break
elif str(logindata[0])=='wechat':
for wl in range(0,group_l):
if str(group_list[wl][0])==str(logindata[1]):
senddata=str(logindata[2])+":"+str(logindata[3])
l = len(group_list[wl])
try:
if l >=2:
for x in range(1, l):
group_list[wl][x].send(senddata.encode())
else:
clientsock.send(senddata.encode())
break
print("群聊信息" + str(senddata)+str(clientaddress))
except ValueError:
break
elif str(logindata[0])=='personal':
#print(logindata)
user_cl = len(user_client)
#print(user_client)
send_info = str(logindata[1])+":"+str(logindata[3])
z=1
for pl in range(0,user_cl):
if user_client[pl][0]==logindata[2]:
user_client[pl][1].send(send_info.encode())
#clientsock.send(send_info.encode())
break
elif z==user_cl:
back=str(logindata[2])+'不在线'
clientsock.send(back.encode())
z+=1
elif str(logindata[0])=='':
print('无法识别:')
print(logindata[0])
break
clientsock.close()
del client_list[-1]
while True:
clientsock,clientaddress=s.accept()
client_list.append(clientsock)
print('connect from:',clientaddress)
'''joinfo=str(clientaddress)
try:
ld=len(client_list)
for x in range(0, ld):
client_list[x].send(joinfo.encode())
except ValueError:
continue
'''
t=threading.Thread(target=tcplink,args=(clientsock,clientaddress)) #新创建的线程
t.start()
s.close()
客户端源码比较多就不一 一详解了。可访问本人主页下载源码:
旧版:基于tcp协议,PyQt5开发的仿QQ_pyqt网络-网络基础代码类资源-CSDN下载
新版本:鉴于很多人问我如何支持数据库,增加QQ注册功能,本人修改了服务端代码,增加了这些功能。下载地址:基于Tcpsocket通信的Pyqt5仿QQ-Python文档类资源-CSDN下载
有问题可以直接在csdn私聊提问。
版权声明:本文标题:PyQt5仿QQ(基于tcp协议) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1727792078a1129943.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论