python實(shí)現(xiàn)簡(jiǎn)單聊天室功能 可以私聊
本文實(shí)例為大家分享了python實(shí)現(xiàn)簡(jiǎn)單聊天室功能的具體代碼,供大家參考,具體內(nèi)容如下
公共模塊
首先寫一個(gè)公共類,用字典的形式對(duì)數(shù)據(jù)的收發(fā),并且進(jìn)行封裝,導(dǎo)入struct解決了TCP的粘包問題,并在公共類中進(jìn)行了異常處理
import socket,struct,json def send_dic(c,dic): dic_json=json.dumps(dic) dic_json_length=len(dic_json.encode('utf-8')) struct_dic_json_length=struct.pack('q',dic_json_length) c.send(struct_dic_json_length) c.send(dic_json.encode('utf-8')) def get_dic(c): try: dic_length=struct.unpack('q',c.recv(8))[0] except: return {'msg':'exit'} try: dic_json=c.recv(dic_length).decode('utf-8') except: return {'msg':'exit'} dic=json.loads(dic_json) return dic
服務(wù)器端
import socket from concurrent.futures import ThreadPoolExecutor import lib.common #導(dǎo)入寫在lib里面的公共模塊,代碼在上面 import re #進(jìn)行開啟服務(wù)器等一系列操作 s=socket.socket() ip_host=('127.0.0.1',8000) s.bind(ip_host) s.listen() #創(chuàng)建一個(gè)列表,用來保存客戶端及其信息 c_list=[] def get_send_msg(c,addr,c_list): while True: tag=False dic=lib.common.get_dic(c) if dic['msg']=='exit': #如果接受出異常,或是客戶端主動(dòng)輸入為exit,在列表中移除客戶端信息 for i in c_list: if i['addr']==addr: c_list.remove(i) break if dic['is_siliao']==True: #客戶端發(fā)來的字典里面如果is_siliao==True,進(jìn)入私聊代碼 for i in c_list: #遍歷列表,并用正則表達(dá)式截取信息 li=re.findall('(.*?)@%s(.*)'%i['name'],dic['msg']) if len(li)!=0: dic['msg']=li[0][0]+li[0][1] lib.common.send_dic(i['client'],dic) tag=True break if tag: continue #如果不是私聊,進(jìn)入下面代碼,在聊天室進(jìn)行群聊 for i in c_list: if i['addr']!=addr: lib.common.send_dic(i['client'],dic) while True: #用線程池,進(jìn)行多次連接 print('客戶端等待連接') c,addr=s.accept() print('%s連接了服務(wù)器'%addr[1]) name=c.recv(1024).decode('utf-8')#進(jìn)行第一次接受,接受客戶端的名字,為私聊的功能做準(zhǔn)備 c_dic={'addr':addr,'client':c,'name':name}#將客戶端的信息保存在字典中 c_list.append(c_dic)#將字典加入列表 t=ThreadPoolExecutor() t.submit(get_send_msg,c,addr,c_list)
客戶端:
import lib.common from concurrent.futures import ThreadPoolExecutor c=socket.socket() ip_host=('127.0.0.1',8000) c.connect(ip_host) def send_msg(c,name): while True: msg = input ('>>:').strip () is_siliao=False if not msg: continue # if msg.startswith('@'): if '@'in msg: is_siliao=True dic = {'msg': msg,'name':name,'is_siliao':is_siliao} lib.common.send_dic(c,dic) if msg=='exit': c.close () break def get_msg(c): while True: dic=lib.common.get_dic(c) if dic['is_siliao']==True: print('來自%s的私聊:%s'%(dic['name'],dic['msg'])) continue print('%s:%s'%(dic['name'],dic['msg'])) t=ThreadPoolExecutor() name=input('你的聊天名字:').strip() c.send(name.encode('utf-8')) t.submit(send_msg,c,name) t.submit(get_msg,c)
運(yùn)行代碼截圖:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python實(shí)現(xiàn)多人聊天室
- python socket多線程通訊實(shí)例分析(聊天室)
- 小小聊天室Python代碼實(shí)現(xiàn)
- python實(shí)現(xiàn)簡(jiǎn)單多人聊天室
- 基于python實(shí)現(xiàn)聊天室程序
- Python socket實(shí)現(xiàn)簡(jiǎn)單聊天室
- python實(shí)現(xiàn)文本界面網(wǎng)絡(luò)聊天室
- Python聊天室程序(基礎(chǔ)版)
- python3實(shí)現(xiàn)多線程聊天室
- Python聊天室?guī)Ы缑鎸?shí)現(xiàn)的示例代碼(tkinter,Mysql,Treading,socket)
相關(guān)文章
使用torchtext導(dǎo)入NLP數(shù)據(jù)集的操作
這篇文章主要介紹了使用torchtext導(dǎo)入NLP數(shù)據(jù)集的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05對(duì)python讀取CT醫(yī)學(xué)圖像的實(shí)例詳解
今天小編就為大家分享一篇對(duì)python讀取CT醫(yī)學(xué)圖像的實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01python使用redis模塊來跟redis實(shí)現(xiàn)交互
這篇文章主要介紹了python使用redis模塊來跟redis實(shí)現(xiàn)交互,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06Python sqlalchemy時(shí)間戳及密碼管理實(shí)現(xiàn)代碼詳解
這篇文章主要介紹了Python sqlalchemy時(shí)間戳及密碼管理實(shí)現(xiàn)代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Django基礎(chǔ)知識(shí) URL路由系統(tǒng)詳解
這篇文章主要介紹了Django基礎(chǔ)知識(shí) URL路由系統(tǒng)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07django 數(shù)據(jù)庫 get_or_create函數(shù)返回值是tuple的問題
這篇文章主要介紹了django 數(shù)據(jù)庫 get_or_create函數(shù)返回值是tuple的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05Python實(shí)現(xiàn)對(duì)數(shù)坐標(biāo)系繪制與自定義映射
這篇文章主要為大家學(xué)習(xí)介紹了如何利用Python實(shí)現(xiàn)對(duì)數(shù)坐標(biāo)系繪制與坐標(biāo)自定義映射,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-08-08python對(duì)日志進(jìn)行處理的實(shí)例代碼
本篇文章給大家分享了關(guān)于python處理日志的方法以及相關(guān)實(shí)例代碼,有興趣的朋友們學(xué)習(xí)下。2018-10-10