python實現(xiàn)簡單聊天室功能 可以私聊
更新時間:2019年07月12日 14:45:19 作者:日天達人
這篇文章主要為大家詳細介紹了python實現(xiàn)簡單聊天室功能,可以進行私聊,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了python實現(xiàn)簡單聊天室功能的具體代碼,供大家參考,具體內容如下
公共模塊
首先寫一個公共類,用字典的形式對數(shù)據(jù)的收發(fā),并且進行封裝,導入struct解決了TCP的粘包問題,并在公共類中進行了異常處理
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
服務器端
import socket
from concurrent.futures import ThreadPoolExecutor
import lib.common #導入寫在lib里面的公共模塊,代碼在上面
import re
#進行開啟服務器等一系列操作
s=socket.socket()
ip_host=('127.0.0.1',8000)
s.bind(ip_host)
s.listen()
#創(chuàng)建一個列表,用來保存客戶端及其信息
c_list=[]
def get_send_msg(c,addr,c_list):
while True:
tag=False
dic=lib.common.get_dic(c)
if dic['msg']=='exit':
#如果接受出異常,或是客戶端主動輸入為exit,在列表中移除客戶端信息
for i in c_list:
if i['addr']==addr:
c_list.remove(i)
break
if dic['is_siliao']==True:
#客戶端發(fā)來的字典里面如果is_siliao==True,進入私聊代碼
for i in c_list:
#遍歷列表,并用正則表達式截取信息
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
#如果不是私聊,進入下面代碼,在聊天室進行群聊
for i in c_list:
if i['addr']!=addr:
lib.common.send_dic(i['client'],dic)
while True:
#用線程池,進行多次連接
print('客戶端等待連接')
c,addr=s.accept()
print('%s連接了服務器'%addr[1])
name=c.recv(1024).decode('utf-8')#進行第一次接受,接受客戶端的名字,為私聊的功能做準備
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)
運行代碼截圖:





以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
使用torchtext導入NLP數(shù)據(jù)集的操作
這篇文章主要介紹了使用torchtext導入NLP數(shù)據(jù)集的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05
python使用redis模塊來跟redis實現(xiàn)交互
這篇文章主要介紹了python使用redis模塊來跟redis實現(xiàn)交互,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-06-06
Python sqlalchemy時間戳及密碼管理實現(xiàn)代碼詳解
這篇文章主要介紹了Python sqlalchemy時間戳及密碼管理實現(xiàn)代碼詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08
django 數(shù)據(jù)庫 get_or_create函數(shù)返回值是tuple的問題
這篇文章主要介紹了django 數(shù)據(jù)庫 get_or_create函數(shù)返回值是tuple的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Python實現(xiàn)對數(shù)坐標系繪制與自定義映射
這篇文章主要為大家學習介紹了如何利用Python實現(xiàn)對數(shù)坐標系繪制與坐標自定義映射,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-08-08

