网络协议课程的设计往往既具挑战性又充满乐趣。这位同学在时间紧迫的情况下选择了TCP协议来开发类似QQ的软件,并且持续优化功能。这一过程肯定有许多值得讨论的地方,同时对有类似设计需求的同学具有启发意义。
课程设计与时间压力
网络协议课程的设计并非易事。尤其在时间紧迫的情况下,人们往往只能挑选较为简单的Tcp通信协议。这种情况在许多学生中很常见,比如大学期末,作业众多且各有难度。这位同学在时间压力下做出的选择,实际上是一种明智的决策。课程设计是检验学习成果的手段,而在有限的时间内确定方向,成功的可能性更大。此外,时间压力还能激发人的斗志,促使人尽快掌握相关知识并加以应用。对于Tcp这样的基础且应用广泛的协议,即便时间有限,也能取得不错的成果。
仿QQ软件能够提供众多实用特性。无论是个人间的对话还是多人交流,便捷的操作同样至关重要。在日常使用QQ时,人们普遍追求操作的简便性。在开发此类软件时,合理设置功能是提升其易用性的核心。
Tcp协议的应用
Tcp协议堪称网络通信的支柱。若要开发类似QQ的软件,必须首先通过Tcp的三次握手来建立连接,确保数据传输的准确性。这就像两个人传递信息前先握手三次,确认彼此都已准备好。众多互联网企业的数据交流都依赖于Tcp协议。例如,网络服务提供商在大量数据传输过程中,Tcp协议保证了信息的无误传输。这款仿QQ软件正是基于这一原理来实现信息互发的。同时,多线程原理也在此发挥了作用,使得多人同时进行通信变得简单。在大型在线聊天应用中,这样的设计模式也相当普遍,确保了众多用户能够同时聊天而不会出现混乱。
编写服务端和客户端代码需要特别注意。服务端需确保保存好通信连接,并对其进行标记,以便于后续发送消息时能够准确找到对应连接。在实际操作中,必须先启动服务端,然后才是客户端,这个启动顺序不可颠倒。这和现实中的网络服务搭建过程颇为相似,必须先设置好服务器后端,用户才能顺利执行客户端的操作。
PyQt5图形库支持
PyQt5图形库是这个仿制QQ软件的一大优势。它让界面设计变得可行。例如,登录界面和聊天界面的设计,都依赖于这个图形库。过去,不少小软件开发者在未接触这种实用的图形库前,很难制作出美观的交互界面。但在这里,通过使用PyQt5,我们成功打造出了逼真的仿QQ界面。对于开发者来说,PyQt5的操作相对友好,降低了开发难度,并提升了软件的视觉效果。在整个开发过程中,PyQt5解决了众多界面难题,若没有这个图形库,构建如此完整的仿QQ功能可能会变得十分困难。
数据库的加入
增强数据库功能对这款模仿QQ的软件意义重大。起初,它可能只是一款基础的聊天应用。然而,引入mysql数据库后,情况就大不相同了。以往不少软件缺乏数据库功能,导致数据难以妥善保存,比如聊天记录等关键信息往往难以保留。这款仿QQ软件依托mysql数据库,能够存储用户账号、好友关系等数据。在聊天程序发展到一定阶段,数据库成为关键部分,便于统一管理数据,提升软件的稳定性和实用性。在此设计中,数据库的功能不仅仅是存储数据,还支持注册、多账号登录等功能。
功能拓展进程
从最初的版本到新增加的功能版本,这一变化过程非常值得关注。早期版本有其成就,而新版本则根据用户需求新增了注册等新功能。过去,不少同学可能觉得软件功能不够完善,于是向开发者提出疑问。这和许多商业软件一样,用户的需要促使功能更新。以市场上的某些社交软件为例,当用户反映缺少某些社交功能时,开发者会进行改进。这个模仿QQ的软件同样是根据同学们的提问不断优化功能。可以说,软件的发展是一个需求持续反馈和功能持续丰富、完善的过程。
源码分享与交流
开发者慷慨地公布源代码,真是太好了。这给其他学习者带来了诸多方便。你可以在网站上轻松下载到源码,无论是老版本还是新版本。在进行学术研究或个人开发实践时,这些代码都能派上用场。在专注于网络协议开发的圈子中,这样的源码共享应当更加常见。它为那些希望学习相关知识技能的人提供了宝贵的参考。正如许多开源项目那样,大家都能通过交流、提问来提升自己的开发技能。换作是你,你会不会下载这些源码并研究其中的编程逻辑?希望大家都来点赞并分享这篇文章,在评论区留下你的见解。
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()