日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:153日期:2022-06-29 08:21:47
實驗名稱:

網(wǎng)絡聊天室

功能:

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

概述

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

代碼解釋

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

設置登錄窗口

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

設置消息界面

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

設置在線用戶列表。

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

完整代碼: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)計當前在線人員 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)重復,則在出現(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)): # 檢驗重名,則在重名用戶后加數(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é)束后關閉連接。 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) # 服務器段刪除退出的用戶 breakj = j+1 USERS = onlines() self.Load(USERS,addr) conn.close()# 將地址與數(shù)據(jù)(需發(fā)送給客戶端)存入messages隊列。 def Load(self, data, addr): lock.acquire() try: messages.put((addr, data)) finally: lock.release() # 服務端在接受到數(shù)據(jù)后,會對其進行一些處理然后發(fā)送給客戶端,如下圖,對于聊天內(nèi)容,服務端直接發(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 # 用于判斷是開還是關閉列表框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, ’歡迎進入群聊,大家開始聊天吧!’, ’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, '當前在線用戶')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()

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

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产亚洲电影| 国产一区二区久久久久| 国产精品字幕| 午夜精品成人av| 国产精品nxnn| 亚洲无线观看| 欧美午夜精彩| 制服诱惑一区二区| 激情综合在线| 黄色aa久久| 91亚洲国产高清| 激情综合激情| 美女日韩在线中文字幕| 日韩大片在线| 欧美日韩激情在线一区二区三区| 精品国产一级| 日本免费一区二区三区四区| 午夜国产一区二区| 亚洲精品伊人| 国产日韩欧美一区| 欧美91在线| 92国产精品| 日韩精品不卡一区二区| 中文字幕成在线观看| 在线视频观看日韩| 热久久国产精品| 久久午夜视频| 国产一精品一av一免费爽爽| 国产欧美一级| 日韩成人亚洲| 国产精品毛片一区二区三区| 国产日韩精品视频一区二区三区| 欧美精品中文| 国产一区二区色噜噜| 国内在线观看一区二区三区| av中文字幕在线观看第一页| 蜜臀久久精品| 欧美jjzz| 亚洲精品欧美| 国产精品一区免费在线| 狂野欧美性猛交xxxx| 欧美~级网站不卡| 91精品视频一区二区| 亚洲欧洲一区| 日产精品一区| 精品久久97| 97成人超碰| 久久午夜影视| 91精品啪在线观看国产18| 日本va欧美va欧美va精品| 欧美日韩一区二区综合| 麻豆91精品91久久久的内涵| 午夜精品影视国产一区在线麻豆| 成人羞羞在线观看网站| 麻豆成人av在线| 国产劲爆久久| 日韩区欧美区| 一区三区视频| 亚洲电影在线| 精品丝袜在线| 91精品在线观看国产| 国产拍在线视频| 国产成人免费av一区二区午夜| 国产欧美一区| 麻豆视频久久| 欧美日韩伊人| 国产欧美69| 久久99偷拍| 老色鬼精品视频在线观看播放| 日韩国产欧美视频| 欧美国产另类| 中文字幕在线官网| 私拍精品福利视频在线一区| 欧美日韩尤物久久| 国产午夜精品一区二区三区欧美 | 欧美成a人片免费观看久久五月天| 日韩av网站在线免费观看| 国产一精品一av一免费爽爽| 亚洲精品少妇| 国产精品男女| 91一区二区| 亚洲自啪免费| 国产精品一区亚洲| 日韩中文在线电影| 久久亚洲美女| 国产精品99久久免费| www.com.cn成人| 视频一区在线视频| 国产精品黄色片| 欧美午夜精彩| 国产乱子精品一区二区在线观看 | 加勒比视频一区| 天堂资源在线亚洲| 日韩一区二区三区免费视频| 久久97视频| 午夜国产一区二区| 国产美女视频一区二区| 婷婷成人在线| 国产精品大片| 欧美在线影院| 国产在视频一区二区三区吞精| 不卡一区综合视频| 久久天堂影院| 亚洲18在线| 国精品一区二区| 国产丝袜一区| 五月天综合网站| 97精品一区| 国产精品一区二区精品视频观看 | 欧美亚洲免费| 欧美日韩国产高清电影| 福利一区和二区| 日韩av在线播放中文字幕| 在线天堂资源www在线污| 久久国内精品视频| 欧美日韩视频| 日韩欧美国产精品综合嫩v| 国产精品夜夜夜| 亚洲欧洲一区| 婷婷激情图片久久| 亚洲欧美伊人| 红桃视频欧美| 国精品一区二区三区| 久久裸体视频| 视频在线不卡免费观看| 久久精品国产在热久久| 国产精品porn| 麻豆精品av| 日本а中文在线天堂| se01亚洲视频| 91精品国产调教在线观看| 97精品国产| 久久免费大视频| 色天使综合视频| 色88888久久久久久影院| 久久久久网站| 国产午夜精品一区二区三区欧美| 亚洲一区激情| 久久国产精品色av免费看| 麻豆中文一区二区| 国产拍在线视频| 精品中文字幕一区二区三区av| 午夜久久tv| 亚洲人成在线影院| 免费在线亚洲欧美| 日韩高清中文字幕一区二区| 欧美另类专区| 欧美精品观看| 精品欠久久久中文字幕加勒比| 日韩电影免费网址| 日韩一级不卡| 久久中文精品| 亚洲一区二区免费看| 国产图片一区| 精品日韩毛片| 国产亚洲欧美日韩在线观看一区二区| 久久97久久97精品免视看秋霞| 欧美jjzz| 精品午夜视频| 丝袜诱惑制服诱惑色一区在线观看| 国产午夜一区| 美女被久久久| 伊人久久国产| 亚洲尤物av| 久久黄色影院| 国产精品久久久网站| 国产模特精品视频久久久久| 麻豆一区在线| 日韩在线电影| 欧美大黑bbbbbbbbb在线| 国产亚洲久久| 免费成人在线影院| av一区在线| 免费视频一区二区三区在线观看 | 中文字幕日本一区| 97精品国产一区二区三区| 日韩精品导航| 国产精品视区| 欧美aa国产视频| 欧美三区四区| 国产精品99久久免费观看| 在线观看亚洲精品福利片| 久久网站免费观看| 国产精品99久久精品| 国产乱子精品一区二区在线观看 | 欧美日韩一区二区三区四区在线观看| 久久亚洲成人| 另类中文字幕国产精品| 精品一区二区三区中文字幕| 青青国产精品| 日韩av中文在线观看| 日韩视频1区| 97se亚洲| 国产伦理久久久久久妇女| 日本中文字幕视频一区| 日韩精品中文字幕一区二区| 亚洲综合图色| 欧美伊人久久| 日韩av一区二区在线影视| 亚洲ab电影|