您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 基于python的GUI聊天室设计
禁止转载!基于python的聊天室设计0实验目的利用所学的各种协议的原理,实现一个简单的聊天功能。1实验原理Socket:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。Socket的英文原义是“孔”或“插座”。作为BSDUNIX的进程通信机制,取后一种意思。通常也称作套接字,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电,有的提供110伏交流电,有的则提供有线电视节目。客户软件将插头插到不同编号的插座,就可以得到不同的服务。2程序介绍2.1Server本服务用于开启聊天室的服务功能,实现验证客户,监听用户事件,监控用户聊天行为和转发聊天消息。其中:tell主要实现聊天信息的转发功能,通过查询用户列表筛选出列表之外的用户,并同时将聊天的用户名,时间,以及聊天的内容转发出去serverFunc实现了接收用户的昵称,监控并通知用户行为的功能main完成了初始的验证和建立连接的过程特点:利用了socket中的SOCK_STREAM实现TCP连接使用了多线程的方法,避免程序阻塞禁止转载!2.2clientClient启动了一个聊天窗口,支持多人的在线连接(最多5人)recvMsg完成接收消息的行为,并且实时的将接收到的消息刷新到屏幕上,同时对多个异常(OSError,ConnectionAbortedError,ConnectionResetError)进行了捕获以更完善.sendMsg完成发送消息的功能,可做到发送消息和将消息显示在主窗口中cancelMsg定义一个清除事件,用户可以一键删除在输入框中的文本sendMsgEvent通过行为事件监听用户输入,当按下发送按钮,调用sendMsg服务mainloop循环主窗口,实现界面的刷新。禁止转载!3功能展示服务端日志聊天用户1禁止转载!聊天用户24.实验感想通过这次实验,巩固了学习的通信协议的原理,同时检验了一番编程功底,觉得自己收获颇丰。完成程序之后觉得十分有成就感。禁止转载!5.代码#!python#code=utf-8ChattingroomclientAuthor:yangnanDate:20171025Version:2.1fromtkinterimport*importtime,socket,threading,sysdefmain():#initials=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.connect(('localhost',5000))try:machCode='test's.send(machCode.encode())exceptConnectionRefusedError:print('Warning:TheMATCHCODEiserror!')sys.exit()exceptKeyboardInterrupt:print('\nNotice:Youhavequitedthesystem!')sys.exit()exceptConnectionAbortedError:print('Notice:Serverhasclosedyourconnection!')sys.exit()exceptConnectionResetError:print('Warning:Theserverisclosed!')sys.exit()try:print(s.recv(1024).decode())nickname=input('Notice:Inputyournickname:')#nickname='test's.sendall(nickname.encode())exceptKeyboardInterrupt:print('\nNotice:Youhavequitedthesystem!')sys.exit()exceptConnectionResetError:print('Warning:Theserverisclosed!')sys.exit()defrecvMsg(factor=0):#receivemessagetry:禁止转载!exceptConnectionResetError:print('Warning:Theserverisclosed!')sys.exit()defrecvMsg(factor=0):#receivemessagetry:recvContent=s.recv(1024).decode()except(OSError,ConnectionAbortedError,ConnectionResetError):recvContent='Warning:SERVERERROR'else:ifrecvContent:name,content=recvContent.split('',1)strMsg=name+''+time.strftime(%Y-%m-%d%H:%M:%S,time.localtime())+'\n'+contenttxtMsgList.insert(END,strMsg)else:passtimer=threading.Timer(0.1,recvMsg)timer.setDaemon(True)timer.start()#sendMessagedefsendMsg():content=txtMsg.get('0.0',END)iflen(content)!=1:try:s.sendall(content.encode())exceptConnectionAbortedError:strMsg='Notice:'+time.strftime(%Y-%m-%d%H:%M:%S,time.localtime())+'\n'+'Serverhasclosedyourconnection!\n'txtMsgList.insert(END,strMsg)exceptConnectionResetError:strMsg='Notice:'+time.strftime(%Y-%m-%d%H:%M:%S,time.localtime())+'\n'+'Serverisclosed!\n'txtMsgList.insert(END,strMsg)else:strMsg='鎴?:'+time.strftime(%Y-%m-%d%H:%M:%S,time.localtime())+'\n'+contenttxtMsgList.insert(END,strMsg)txtMsg.delete('0.0',END)defcancelMsg():#cancelMessagetxtMsg.delete('0.0',END)defsendMsgEvent(event):#sendMessageEventifevent.keysym==Up:sendMsg()#Createwindow禁止转载!defcancelMsg():#cancelMessagetxtMsg.delete('0.0',END)defsendMsgEvent(event):#sendMessageEventifevent.keysym==Up:sendMsg()#Createwindowt=Tk()t.title('Chattingroom')#CreateframefrmLT=Frame(width=500,height=320,bg='white')frmLC=Frame(width=500,height=150,bg='white')frmLB=Frame(width=500,height=30)frmRT=Frame(width=200,height=500)#CreatecontrolstxtMsgList=Text(frmLT)txtMsgList.tag_config('greencolor',foreground='#008C00')#鍒?寤?tagtxtMsg=Text(frmLC)txtMsg.bind(KeyPress-Up,sendMsgEvent)btnSend=Button(frmLB,text='鍙?閫?',width=8,command=sendMsg)btnCancel=Button(frmLB,text='鍙?娑?',width=8,command=cancelMsg)imgInfo=PhotoImage(file=python.gif)lblImage=Label(frmRT,image=imgInfo)lblImage.image=imgInfo#LayoutfrmLT.grid(row=0,column=0,columnspan=2,padx=1,pady=3)frmLC.grid(row=1,column=0,columnspan=2,padx=1,pady=3)frmLB.grid(row=2,column=0,columnspan=2)frmRT.grid(row=0,column=2,rowspan=3,padx=2,pady=3)#FixedsizefrmLT.grid_propagate(0)frmLC.grid_propagate(0)frmLB.grid_propagate(0)frmRT.grid_propagate(0)btnSend.grid(row=2,column=0)btnCancel.grid(row=2,column=1)lblImage.grid()txtMsgList.grid()txtMsg.grid()#Recvlooptimer=threading.Timer(0.1,recvMsg)timer.setDaemon(True)timer.start()#Mainloopt.mainloop()禁止转载!Client#Recvlooptimer=threading.Timer(0.1,recvMsg)timer.setDaemon(True)timer.start()#Mainloopt.mainloop()if__name__=='__main__':main()#!python#code=utf-8Chattingroomserverauthor:yangnandata:20171022version:1.2importsocketimporttimeimportthreadingimportsyss=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.bind((localhost,5000))s.listen(5)print(Server:,socket.gethostbyname('localhost'),islistening...)userdict=dict()userlist=list()deftell(exceptUser,content):@exceptUser:everyoneelse@content:thecontentoftalkforulinuserlist:iful.fileno()!=exceptUser:try:ul.sendall(content.encode())except:passdefserv
本文标题:基于python的GUI聊天室设计
链接地址:https://www.777doc.com/doc-6037619 .html