电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)

瀏覽:60日期:2022-06-29 08:21:47
實(shí)驗(yàn)名稱:

網(wǎng)絡(luò)聊天室

功能:

i. 掌握利用Socket進(jìn)行編程的技術(shù)ii. 掌握多線程技術(shù),保證雙方可以同時(shí)發(fā)送iii. 建立聊天工具iv. 可以和單人聊天v. 可以和多個(gè)人同時(shí)進(jìn)行聊天vi. 使用圖形界面,顯示雙方的語錄vii. 程序可以在一定程度上進(jìn)行錯誤識別

概述

實(shí)驗(yàn)通過聊天室可以完成單人或多人之間的聊天通信,功能的實(shí)現(xiàn)主要是通過Socket通信來實(shí)現(xiàn)。本次實(shí)驗(yàn)采用客戶端/服務(wù)器(C/S)架構(gòu)模式,通過Python語言來編寫服務(wù)器端與客戶端的程序。運(yùn)用多線程可完成多點(diǎn)對多點(diǎn)的聊天。服務(wù)器端程序主要用于接收用戶信息,消息接收與轉(zhuǎn)發(fā)。客戶端程序?qū)崿F(xiàn)用戶注冊登錄,聊天信息顯示與信息輸入。

代碼解釋

統(tǒng)計(jì)當(dāng)前在線人數(shù),并且將新用戶加到用戶列表中。Serve.py

Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)

這是服務(wù)器對于聊天服務(wù)的實(shí)現(xiàn)。

Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)

通過繼承threading.Thread類而實(shí)現(xiàn)多線程,重寫run函數(shù)。

Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)

接受來自客戶端的用戶名,如果用戶名為空,使用用戶的IP與端口作為用戶名。如果用戶名出現(xiàn)重復(fù),則在出現(xiàn)的用戶名依此加上后綴“2”、“3”、“4”……

Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)

在獲取用戶名后便會不斷地接受用戶端發(fā)來的消息(即聊天內(nèi)容),結(jié)束后關(guān)閉連接。

Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)

如果用戶斷開連接,將該用戶從用戶列表中刪除,然后更新用戶列表。

Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)

將地址與數(shù)據(jù)(需發(fā)送給客戶端)存入messages隊(duì)列。

Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)

服務(wù)端在接受到數(shù)據(jù)后,會對其進(jìn)行一些處理然后發(fā)送給客戶端,如下圖,對于聊天內(nèi)容,服務(wù)端直接發(fā)送給客戶端,而對于用戶列表,便由json.dumps處理后發(fā)送。

Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)

Client.py建立連接,發(fā)送用戶名及判斷是否為私聊消息,私聊用~識別

Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)

接受來自服務(wù)器發(fā)送的消息

Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)

對接收到的消息進(jìn)行判斷,如果是在線用戶列表(用json.dumps處理過),便清空在線用戶列表框,并將此列表輸出在在線用戶列表框中。

Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)

如果是聊天內(nèi)容,便將其輸出在聊天內(nèi)容顯示框中。

Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)

設(shè)置登錄窗口

Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)

設(shè)置消息界面

Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)

設(shè)置在線用戶列表。

Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)

完整代碼:Serve.py

import socketimport threadingimport queueimport json # json.dumps(some)打包 json.loads(some)解包import osimport os.pathimport sysIP = ’127.0.0.1’PORT = 9999 # 端口messages = queue.Queue()users = [] # 0:userName 1:connectionlock = threading.Lock()def onlines(): # 統(tǒng)計(jì)當(dāng)前在線人員 online = [] for i in range(len(users)): online.append(users[i][0]) return onlineclass ChatServer(threading.Thread): global users, que, lock def __init__(self): # 構(gòu)造函數(shù) threading.Thread.__init__(self) self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) os.chdir(sys.path[0])# 接受來自客戶端的用戶名,如果用戶名為空,使用用戶的IP與端口作為用戶名。如果用戶名出現(xiàn)重復(fù),則在出現(xiàn)的用戶名依此加上后綴“2”、“3”、“4”…… def receive(self, conn, addr): # 接收消息 user = conn.recv(1024) # 用戶名稱 user = user.decode() if user == ’用戶名不存在’: user = addr[0] + ’:’ + str(addr[1]) tag = 1 temp = user for i in range(len(users)): # 檢驗(yàn)重名,則在重名用戶后加數(shù)字 if users[i][0] == user:tag = tag + 1user = temp + str(tag) users.append((user, conn)) USERS = onlines() self.Load(USERS,addr) # 在獲取用戶名后便會不斷地接受用戶端發(fā)來的消息(即聊天內(nèi)容),結(jié)束后關(guān)閉連接。 try: while True:message = conn.recv(1024) # 發(fā)送消息message = message.decode()message = user + ’:’ + messageself.Load(message,addr) conn.close() # 如果用戶斷開連接,將該用戶從用戶列表中刪除,然后更新用戶列表。 except:j = 0 # 用戶斷開連接 for man in users:if man[0] == user: users.pop(j) # 服務(wù)器段刪除退出的用戶 breakj = j+1 USERS = onlines() self.Load(USERS,addr) conn.close()# 將地址與數(shù)據(jù)(需發(fā)送給客戶端)存入messages隊(duì)列。 def Load(self, data, addr): lock.acquire() try: messages.put((addr, data)) finally: lock.release() # 服務(wù)端在接受到數(shù)據(jù)后,會對其進(jìn)行一些處理然后發(fā)送給客戶端,如下圖,對于聊天內(nèi)容,服務(wù)端直接發(fā)送給客戶端,而對于用戶列表,便由json.dumps處理后發(fā)送。 def sendData(self): # 發(fā)送數(shù)據(jù) while True: if not messages.empty():message = messages.get()if isinstance(message[1], str): for i in range(len(users)): data = ’ ’ + message[1] users[i][1].send(data.encode()) print(data) print(’n’)if isinstance(message[1], list): data = json.dumps(message[1]) for i in range(len(users)): try: users[i][1].send(data.encode()) except: pass def run(self): self.s.bind((IP,PORT)) self.s.listen(5) q = threading.Thread(target=self.sendData) q.start() while True: conn, addr = self.s.accept() t = threading.Thread(target=self.receive, args=(conn, addr)) t.start() self.s.close()if __name__ == ’__main__’: cserver = ChatServer()cserver.start()

Client.py

import socketimport tkinterimport tkinter.messageboximport threadingimport jsonimport tkinter.filedialogfrom tkinter.scrolledtext import ScrolledTextIP = ’’PORT = ’’user = ’’listbox1 = ’’ # 用于顯示在線用戶的列表框show = 1 # 用于判斷是開還是關(guān)閉列表框users = [] # 在線用戶列表chat = ’------Group chat-------’ # 聊天對象#登陸窗口root0 = tkinter.Tk()root0.geometry('300x150')root0.title(’用戶登陸窗口’)root0.resizable(0,0)one = tkinter.Label(root0,width=300,height=150,bg='LightBlue')one.pack()IP0 = tkinter.StringVar()IP0.set(’’)USER = tkinter.StringVar()USER.set(’’)labelIP = tkinter.Label(root0,text=’IP地址’,bg='LightBlue')labelIP.place(x=20,y=20,width=100,height=40)entryIP = tkinter.Entry(root0, width=60, textvariable=IP0)entryIP.place(x=120,y=25,width=100,height=30)labelUSER = tkinter.Label(root0,text=’用戶名’,bg='LightBlue')labelUSER.place(x=20,y=70,width=100,height=40)entryUSER = tkinter.Entry(root0, width=60, textvariable=USER)entryUSER.place(x=120,y=75,width=100,height=30)def Login(*args):global IP, PORT, userIP, PORT = entryIP.get().split(’:’)user = entryUSER.get()if not user:tkinter.messagebox.showwarning(’warning’, message=’用戶名為空!’)else:root0.destroy()loginButton = tkinter.Button(root0, text ='登錄', command = Login,bg='Yellow')loginButton.place(x=135,y=110,width=40,height=25)root0.bind(’<Return>’, Login)root0.mainloop()# 建立連接s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((IP, int(PORT)))if user: s.send(user.encode()) # 發(fā)送用戶名else: s.send(’用戶名不存在’.encode()) user = IP + ’:’ + PORT# 聊天窗口root1 = tkinter.Tk()root1.geometry('640x480')root1.title(’群聊’)root1.resizable(0,0)# 消息界面listbox = ScrolledText(root1)listbox.place(x=5, y=0, width=640, height=320)listbox.tag_config(’tag1’, foreground=’red’,backgroun='yellow')listbox.insert(tkinter.END, ’歡迎進(jìn)入群聊,大家開始聊天吧!’, ’tag1’)INPUT = tkinter.StringVar()INPUT.set(’’)entryIuput = tkinter.Entry(root1, width=120, textvariable=INPUT)entryIuput.place(x=5,y=320,width=580,height=170)# 在線用戶列表listbox1 = tkinter.Listbox(root1)listbox1.place(x=510, y=0, width=130, height=320)def send(*args):message = entryIuput.get() + ’~’ + user + ’~’ + chats.send(message.encode())INPUT.set(’’)sendButton = tkinter.Button(root1, text ='n發(fā)nnn送',anchor = ’n’,command = send,font=(’Helvetica’, 18),bg = ’white’)sendButton.place(x=585,y=320,width=55,height=300)root1.bind(’<Return>’, send)def receive():global useswhile True:data = s.recv(1024)data = data.decode()print(data)try:uses = json.loads(data)listbox1.delete(0, tkinter.END)listbox1.insert(tkinter.END, '當(dāng)前在線用戶')listbox1.insert(tkinter.END, '------Group chat-------')for x in range(len(uses)):listbox1.insert(tkinter.END, uses[x])users.append(’------Group chat-------’)except:data = data.split(’~’)message = data[0]userName = data[1]chatwith = data[2]message = ’n’ + messageif chatwith == ’------Group chat-------’: # 群聊if userName == user:listbox.insert(tkinter.END, message)else:listbox.insert(tkinter.END, message)elif userName == user or chatwith == user: # 私聊if userName == user:listbox.tag_config(’tag2’, foreground=’red’)listbox.insert(tkinter.END, message, ’tag2’)else:listbox.tag_config(’tag3’, foreground=’green’)listbox.insert(tkinter.END, message,’tag3’)listbox.see(tkinter.END)r = threading.Thread(target=receive)r.start() # 開始線程接收信息root1.mainloop()s.close()

到此這篇關(guān)于Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)的文章就介紹到這了,更多相關(guān)Python 網(wǎng)絡(luò)聊天室內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 聚天冬氨酸,亚氨基二琥珀酸四钠,PASP,IDS - 远联化工 | 济南轻型钢结构/济南铁艺护栏/济南铁艺大门-济南燕翔铁艺制品有限公司 | 舞台木地板厂家_体育运动木地板_室内篮球馆木地板_实木运动地板厂家_欧氏篮球地板推荐 | 卷筒电缆-拖链电缆-特种柔性扁平电缆定制厂家「上海缆胜」 | 山东商品混凝土搅拌楼-环保型搅拌站-拌合站-分体仓-搅拌机厂家-天宇 | 钢骨架轻型板_膨石轻型板_钢骨架轻型板价格_恒道新材料 | 紧急泄压人孔_防爆阻火器_阻火呼吸阀[河北宏泽石化] | 电车线(用于供电给电车的输电线路)-百科| 液压升降货梯_导轨式升降货梯厂家_升降货梯厂家-河南东圣升降设备有限公司 | 非甲烷总烃分析仪|环控百科 | 急救箱-应急箱-急救包厂家-北京红立方医疗设备有限公司 | LED灯杆屏_LED广告机_户外LED广告机_智慧灯杆_智慧路灯-太龙智显科技(深圳)有限公司 | 3dmax渲染-效果图渲染-影视动画渲染-北京快渲科技有限公司 | 蓝米云-专注于高性价比香港/美国VPS云服务器及海外公益型免费虚拟主机 | 真空粉体取样阀,电动楔式闸阀,电动针型阀-耐苛尔(上海)自动化仪表有限公司 | 防爆型气象站_农业气象站_校园气象站_农业四情监测系统「山东万象环境科技有限公司」 | 深圳VI设计-画册设计-LOGO设计-包装设计-品牌策划公司-[智睿画册设计公司] | YT保温材料_YT无机保温砂浆_外墙保温材料_南阳银通节能建材高新技术开发有限公司 | 儿童语言障碍训练-武汉优佳加感统文化发展有限公司 | 高铝砖-高铝耐火球-高铝耐火砖生产厂家-价格【荣盛耐材】 | 北京燃气公司 用户服务中心| 光栅尺厂家_数显表维修-苏州泽升精密机械 | 废气处理设备-工业除尘器-RTO-RCO-蓄热式焚烧炉厂家-江苏天达环保设备有限公司 | 幂简集成 - 品种超全的API接口平台, 一站搜索、试用、集成国内外API接口 | 地磅-电子地磅维修-电子吊秤-汽车衡-无人值守系统-公路治超-鹰牌衡器 | 行业分析:提及郑州火车站附近真有 特殊按摩 ?2025实地踩坑指南 新手如何避坑不踩雷 | 智能化的检漏仪_气密性测试仪_流量测试仪_流阻阻力测试仪_呼吸管快速检漏仪_连接器防水测试仪_车载镜头测试仪_奥图自动化科技 | 周易算网-八字测算网 - 周易算网-宝宝起名取名测名字周易八字测算网 | 【MBA备考网】-2024年工商管理硕士MBA院校/报考条件/培训/考试科目/提前面试/考试/学费-MBA备考网 | 丙烷/液氧/液氮气化器,丙烷/液氧/液氮汽化器-无锡舍勒能源科技有限公司 | 【ph计】|在线ph计|工业ph计|ph计厂家|ph计价格|酸度计生产厂家_武汉吉尔德科技有限公司 | 生产加气砖设备厂家很多,杜甫机械加气砖设备价格公道 | 北京律师事务所_房屋拆迁律师_24小时免费法律咨询_云合专业律师网 | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | 美国PARKER齿轮泵,美国PARKER柱塞泵,美国PARKER叶片泵,美国PARKER电磁阀,美国PARKER比例阀-上海维特锐实业发展有限公司二部 | 乐泰胶水_loctite_乐泰胶_汉高乐泰授权(中国)总代理-鑫华良供应链 | 北京自然绿环境科技发展有限公司专业生产【洗车机_加油站洗车机-全自动洗车机】 | 辽宁资质代办_辽宁建筑资质办理_辽宁建筑资质延期升级_辽宁中杭资质代办 | HYDAC过滤器,HYDAC滤芯,现货ATOS油泵,ATOS比例阀-东莞市广联自动化科技有限公司 | 道达尔润滑油-食品级润滑油-道达尔导热油-合成导热油,深圳道达尔代理商合-深圳浩方正大官网 | 创富网-B2B网站|供求信息网|b2b平台|专业电子商务网站 |