最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Python打造一個(gè)多人聊天室的示例詳解

 更新時(shí)間:2021年12月22日 16:27:51   作者:python可樂(lè)編程  
這篇文章主要介紹的是利用Python實(shí)現(xiàn)的一個(gè)簡(jiǎn)易的多人聊天室,文中的示例代碼講解詳細(xì),對(duì)學(xué)習(xí)Python有一定的幫助,感興趣的可以學(xué)習(xí)一下

一、實(shí)驗(yàn)名稱(chēng)

建立聊天工具

二、實(shí)驗(yàn)?zāi)康?/span>

掌握Socket編程中流套接字的技術(shù),實(shí)現(xiàn)多臺(tái)電腦之間的聊天。

三、實(shí)驗(yàn)內(nèi)容和要求

vii.掌握利用Socket進(jìn)行編程的技術(shù)

viii.必須掌握多線(xiàn)程技術(shù),保證雙方可以同時(shí)發(fā)送

ix.建立聊天工具

x.可以和多個(gè)人同時(shí)進(jìn)行聊天

xi.必須使用圖形界面,顯示雙方的語(yǔ)錄

四、實(shí)驗(yàn)環(huán)境

PC多臺(tái),操作系統(tǒng)Win7,win10(32位、64位)

具備軟件python3.6 。

五、操作方法與實(shí)驗(yàn)步驟

服務(wù)端

1.調(diào)入多線(xiàn)程、與scoket包,用于實(shí)現(xiàn)多線(xiàn)程連接

2.記錄本地地址與端口,開(kāi)啟監(jiān)聽(tīng),等待請(qǐng)求

3.收到某個(gè)客戶(hù)端的請(qǐng)求,建立連接,為每一個(gè)客戶(hù)端分配一個(gè)線(xiàn)程,并記錄客戶(hù)端地址與端口

4.收到某個(gè)客戶(hù)端發(fā)送的數(shù)據(jù),將數(shù)據(jù)轉(zhuǎn)發(fā)給所有與服務(wù)器連接的客戶(hù)機(jī)。

5.當(dāng)某個(gè)客戶(hù)端斷開(kāi)連接,通知所有與服務(wù)器連接的客戶(hù)機(jī)。

6.服務(wù)器一直保持監(jiān)聽(tīng)狀態(tài),等待其他客戶(hù)端接入服務(wù)器

7.代碼

import socket
import threading

num=0

def chat(service_client_socket,addr): 
    # 等待接收客戶(hù)端消息存放在2個(gè)變量service_client_socket和addr里
    if not addr in user:  
        print('Accept new connection from %s:%s...' % addr)
        # 如果addr不在user字典里則執(zhí)行以下代碼
        for scs in serv_clie_socket: 
            serv_clie_socket[scs].send(data +' 進(jìn)入聊天室...'.encode('utf-8'))  
            # 發(fā)送user字典的data和address到客戶(hù)端
        user[addr] = data.decode('utf-8')  #data 是最新進(jìn)入聊天室的客戶(hù),解壓后放入user
        serv_clie_socket[addr] = service_client_socket #將服務(wù)器與服務(wù)器端口號(hào)為addr的套接字放入字典
        # 接收的消息解碼成utf-8并存在字典user里,鍵名定義為addr
    #print("可以開(kāi)始聊天了>>>>>>")       
    # 如果addr在user字典里,跳過(guò)本次循環(huán)
    while True:
        d = service_client_socket.recv(1024)
        if (('EXIT'.lower() in d.decode('utf-8'))|(d.decode('utf-8') == 'error1')):
            #如果EXIT在發(fā)送的data里
            name = user[addr]   
            #user字典addr鍵對(duì)應(yīng)的值賦值給變量name
            user.pop(addr) 
            serv_clie_socket.pop(addr)     
            #刪除user里的addr
            for scs in serv_clie_socket:     
                #從user取出address
                serv_clie_socket[scs].send((name + ' 離開(kāi)了聊天室...').encode('utf-8'))     
                #發(fā)送name和address到客戶(hù)端
            print('Connection from %s:%s closed.' % addr)
            global num
            num = num-1
            break
        else: 
            print('"%s" from %s:%s' %(d.decode('utf-8'), addr[0], addr[1]))  
            for scs in serv_clie_socket:    
                #從user遍歷出address
                if serv_clie_socket[scs] != service_client_socket:  
                    #address不等于addr時(shí),執(zhí)行下面的代碼
                    serv_clie_socket[scs].send(d)     
                    #發(fā)送data到客戶(hù)端

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 創(chuàng)建socket對(duì)象

addr = ('127.0.0.1', 9999)
s.bind(addr)  # 綁定地址和端口

s.listen(128)

print('TCP Server on', addr[0], ":",addr[1],"......")

user = {}  # 存放字典{addr:name}
serv_clie_socket = {} #存放{socket:不同線(xiàn)程的套接字}
while True:
    try:
        print("等待接收客戶(hù)端的連接請(qǐng)求....")
        service_client_socket, addr = s.accept() # 等待接收客戶(hù)端的連接請(qǐng)求
        print("接收到客戶(hù)端的連接請(qǐng)求....")
    except ConnectionResetError:
        print('Someone left unexcept.')
    data = service_client_socket.recv(1024)
    if data.decode()=='error1':
        print(addr,"關(guān)閉了登錄窗口。。。")
        continue
    print("data = ",data.decode())
    
         
    #為服務(wù)器分配線(xiàn)程
    num=num+1
    r = threading.Thread(target=chat, args=(service_client_socket,addr), daemon=True) 
    r.start()
    print("聊天室人數(shù):",num)


客戶(hù)端

1.調(diào)入多線(xiàn)程、與scoket包,用于實(shí)現(xiàn)多線(xiàn)程連接,調(diào)入tkinter包,用于圖形化頁(yè)面展示

2.記錄本地地址與端口,向服務(wù)器發(fā)送連接請(qǐng)求,建立持續(xù)連接

3.圖形化登錄界面,記錄輸入的用戶(hù)名,發(fā)送給服務(wù)器

4.進(jìn)入聊天界面,從服務(wù)器接收到的消息顯示在左邊,發(fā)送給服務(wù)器的消息顯示在右邊

5.退出時(shí),彈出警示界面。退出后,與服務(wù)器斷開(kāi)連接,結(jié)束。

6.代碼

7.其他:客戶(hù)端代碼中的server改成服務(wù)器地址,客戶(hù)端可以在不同的電腦上運(yùn)行連接服務(wù)器,通過(guò)服務(wù)器與其他的客戶(hù)端通訊。

#客戶(hù)端
import tkinter
from tkinter import font
import tkinter.messagebox
import socket
import threading
import time

string=''
def my_string(s_input):
    string = s_input.get()

def Send(sock):
    '''
        發(fā)送數(shù)據(jù)的方法
        參數(shù):
            sock:定義一個(gè)實(shí)例化socket對(duì)象
            server:傳遞的服務(wù)器IP和端口
    '''
    if string!='':
        message = name + ' : ' + string
        data = message.encode('utf-8')
        sock.send(data)
        if string.lower() == 'EXIT'.lower():
            exit()


def recv(sock):
    sock.send(name.encode('utf-8'))
    while True:
        data = sock.recv(1024)
        #加一個(gè)時(shí)間戳
        time_tuple = time.localtime(time.time())
        str = ("{}點(diǎn){}分".format(time_tuple[3],time_tuple[4]))
        rrecv = tkinter.Label(t,text=data.decode('utf-8'),width=40,anchor='w',bg='pink')#接收的消息靠左邊
        rrecv.pack()

def left():
    global string
    string = rv1.get()
    Send(s)
    if string!='':
        rleft = tkinter.Label(t,text=string,width=40,anchor='e')#發(fā)送的消息靠右邊
        rleft.pack()
        rv1.set('')

def Creat():
    global name
    name = n.get()
    
    #接收進(jìn)程
    tr = threading.Thread(target=recv, args=(s,), daemon=True)
    # daemon=True 表示創(chuàng)建的子線(xiàn)程守護(hù)主線(xiàn)程,主線(xiàn)程退出子線(xiàn)程直接銷(xiāo)毀
    tr.start()
     
    l.destroy()
    e.destroy() 
    b.destroy()
    t.title("聊天室")
    t.geometry("500x600")
    rL0 = tkinter.Label(t,text='%s的聊天室'%name,width=40)
    rL0.pack()
    rL1 = tkinter.Label(t,text='請(qǐng)輸入消息:',width=20, height=1)
    rL1.place(x=0,y=450)
    rE1 = tkinter.Entry(t, textvariable = rv1)
    rE1.place(x=200,y=450) 
    rB1 = tkinter.Button(t, text="發(fā)送",command=left)  
    rB1.place(x=380,y=450)
    #發(fā)送進(jìn)程

def JieShu():
    tkinter.messagebox.showwarning(title='你確定退出嗎?', message='剛才你點(diǎn)擊了關(guān)閉按鈕')
    s.send("error1".encode('utf-8'))
    exit(0)   
    
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    
server = ('10.100.207.40', 9999)
s.connect(server)#建立連接
t=tkinter.Tk()
t.title("多人聊天室")
t.geometry("300x200+500+200")
l = tkinter.Label(t,text='多人聊天室歡迎您,請(qǐng)輸入你的名稱(chēng)',width=40, height=8)
l.pack()
n = tkinter.StringVar()
e = tkinter.Entry(t, width=15,textvariable = n)
e.pack() 
rv1 = tkinter.StringVar()
name = n.get()

b = tkinter.Button(t, text="登錄",width=40, height=10,command=Creat) 

b.pack()
t.protocol("WM_DELETE_WINDOW", JieShu)
t.mainloop()

s.close()

六、實(shí)驗(yàn)數(shù)據(jù)記錄和結(jié)果分析

1.服務(wù)器啟動(dòng),等待客戶(hù)機(jī)連接請(qǐng)求

2.客戶(hù)端請(qǐng)求服務(wù),客戶(hù)端彈出登錄窗口,輸入用戶(hù)名登錄

3.服務(wù)器接收到請(qǐng)求,分配端口,并持續(xù)監(jiān)聽(tīng)其他客戶(hù)機(jī)的請(qǐng)求

4.客戶(hù)端登陸后進(jìn)入聊天窗口

5.進(jìn)入聊天室的用戶(hù),發(fā)送消息,其他用戶(hù)都可以接收到,服務(wù)器也能看到

6.客戶(hù)機(jī)退出連接,其他用戶(hù)都可以接收到,服務(wù)器也能看到

7.其他客戶(hù)機(jī)可以中途進(jìn)入聊天室

以上就是利用Python打造一個(gè)多人聊天室的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Python多人聊天室的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • django form和field具體方法和屬性說(shuō)明

    django form和field具體方法和屬性說(shuō)明

    這篇文章主要介紹了django form和field具體方法和屬性說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • python獲取url的返回信息方法

    python獲取url的返回信息方法

    今天小編就為大家分享一篇python獲取url的返回信息方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Python開(kāi)發(fā)的HTTP庫(kù)requests詳解

    Python開(kāi)發(fā)的HTTP庫(kù)requests詳解

    Requests是用Python語(yǔ)言編寫(xiě),基于urllib,采用Apache2 Licensed開(kāi)源協(xié)議的HTTP庫(kù)。它比urllib更加方便,可以節(jié)約我們大量的工作,完全滿(mǎn)足HTTP測(cè)試需求。Requests的哲學(xué)是以PEP 20 的習(xí)語(yǔ)為中心開(kāi)發(fā)的,所以它比urllib更加Pythoner。更重要的一點(diǎn)是它支持Python3哦!
    2017-08-08
  • Python詳解argparse參數(shù)模塊之命令行參數(shù)

    Python詳解argparse參數(shù)模塊之命令行參數(shù)

    這篇文章主要介紹了Python詳解argparse參數(shù)模塊之命令行參數(shù),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考下面文章詳解
    2022-07-07
  • python wordcloud庫(kù)實(shí)例講解使用方法

    python wordcloud庫(kù)實(shí)例講解使用方法

    這篇文章主要介紹了python wordcloud庫(kù)實(shí)例,詞云通過(guò)以詞語(yǔ)為基本單位,更加直觀和藝術(shù)地展示文本。wordcloud是優(yōu)秀的詞云展示的python第三方庫(kù)
    2022-12-12
  • python3使用sqlite3構(gòu)建本地持久化緩存的過(guò)程

    python3使用sqlite3構(gòu)建本地持久化緩存的過(guò)程

    日常python開(kāi)發(fā)中會(huì)遇到數(shù)據(jù)持久化的問(wèn)題,今天記錄下如何使用sqlite3進(jìn)行數(shù)據(jù)持久化,并提供示例代碼及數(shù)據(jù)查看工具,需要的朋友可以參考下
    2023-11-11
  • Tensorflow卷積神經(jīng)網(wǎng)絡(luò)實(shí)例進(jìn)階

    Tensorflow卷積神經(jīng)網(wǎng)絡(luò)實(shí)例進(jìn)階

    這篇文章主要為大家詳細(xì)介紹了Tensorflow卷積神經(jīng)網(wǎng)絡(luò)實(shí)例進(jìn)階,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Numpy一維線(xiàn)性插值函數(shù)的用法

    Numpy一維線(xiàn)性插值函數(shù)的用法

    這篇文章主要介紹了Numpy一維線(xiàn)性插值函數(shù)的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • Python3.7 新特性之dataclass裝飾器

    Python3.7 新特性之dataclass裝飾器

    Python 3.7中一個(gè)令人興奮的新特性是 data classes 。這篇文章主要介紹了Python3.7 新特性之dataclass裝飾器,需要的朋友可以參考下
    2019-05-05
  • Python區(qū)塊鏈Creating?Miners教程

    Python區(qū)塊鏈Creating?Miners教程

    這篇文章主要為大家介紹了Python區(qū)塊鏈Creating?Miners教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05

最新評(píng)論

延寿县| 罗定市| 金溪县| 嘉兴市| 津市市| 青岛市| 进贤县| 淮滨县| 丰城市| 南丰县| 西吉县| 霍城县| 渝中区| 剑河县| 隆回县| 曲周县| 丹凤县| 龙山县| 东丽区| 桃园市| 和平县| 绍兴市| 盐亭县| 宜黄县| 遂平县| 望都县| 保靖县| 拉孜县| 确山县| 犍为县| 乌兰县| 友谊县| 德兴市| 蒙自县| 唐山市| 怀化市| 彩票| 平舆县| 兴文县| 泸定县| 宽城|