PyQt5仿QQ(基于tcp协议)

最近网络协议课程需要利用所学知识自己设计了一个与网络协议有关的课程设计,由于时间比较赶本人选择了较为简单的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.net/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私聊提问。

  • 5
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雁过留声--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值