日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

接下來我們就使用 Python/ target=_blank class=infotextkey>Python 來操作 socket ,實現一個聊天室的一些主要功能。

首先我們來回想下,一般的聊天室都是怎樣的,有多個用戶可以同時在線,他們可以實時獲取到消息,實時發送消息。

 

服務端的實現

 

那么服務端要實現的就有這么幾點:

 

  • 監聽客戶端的連接
  • 同時操作多個用戶
  • 廣播消息通知

 

代碼擼起來:

 

因為我們要做到 “同時” 去操作用戶,就需要用到多線程:

 

import socket
from threading import Thread

 

接著創建一下 socket ,綁定地址和端口號:

 

host = '127.0.0.1'
port = 8080
s = socket.socket(socket.AF_.NET, socket.SOCK_STREAM)
s.bind((host, port))

 

我們可以定義字典來存放用戶的數據,比如連接用戶的昵稱以及地址:

 

client = {}
addresses = {}

 

再來定義下服務器可接收的 client 連接數:

 

accept_num = 10

 

接下來可以在 main 方法在監聽用戶的連接:

 

if __name__ == '__main__':      s.listen(accept_num)
      print('服務器已經開啟,正在監聽用戶的請求..')

 

接著可以寫一個 whie 循環來接收用戶的連接:

 

while True:         conn, address = s.accept()
         print(address, '已經建立連接')
         conn.send('歡迎你來到帥帥的聊天室,           請輸入你的昵稱進行聊天'.encode('utf8'))

 

接收到用戶的連接之后,我們就可以獲取到用戶的連接和地址信息,可以把地址保存到我們剛剛定義的字典里面來:

 

addresses[conn] = address

 

要支持多個用戶的信息收發,我們可以開啟線程:

 

Thread(target=handle_client_in, args=(conn, address)).start()

 

至此,我們的 main 方法是這樣的:

 


 

接著我們來實現一下用戶的消息處理方法,我們可以接收用戶發來的昵稱消息,這時候就可以在聊天室里面進行廣播,告訴大家 “xxx 加進來了”,另外我們可以把用戶的昵稱加到字典中來:

 

def handle_client_in(conn, addr):
    nikename = conn.recv(1024).decode('utf8')
    welcome = f'歡迎 {nikename} 加入聊天室'
    client[conn] = nikename
    brodcast(bytes(welcome, 'utf8'))

 

接下來可以定義一個 While 循環,來監聽用戶發送的消息,當服務端獲取到用戶發來的消息之后,我們可以在聊天室進行廣播,告訴大家 “xxx 發來了 xxx 消息”,而當用戶由于異常而退出聊天室的時候,我們可以將連接關掉,并且把字典存著的用戶數據給刪掉:

 

while True:
    ¦   try:
    ¦   ¦   msg = conn.recv(1024)
    ¦   ¦   brodcast(msg, nikename+':')
    ¦   except:
    ¦   ¦   conn.close()
    ¦   ¦   del client[conn]
    ¦   ¦   brodcast(bytes(f'{nikename} 離開聊天室', 'utf8'))

 

那么如何對聊天室的用戶進行廣播呢,因為我們剛剛在字典中都存儲了連接進來的用戶連接,那么就可以通過循環的方式向每個用戶發送消息:

 

def brodcast(msg, nikename=''):
    for conn in client:
       conn.send(bytes(nikename, 'utf8') + msg)

 

這樣,一個聊天室的服務端主要功能就完成了:

用 Python 開發一個 「聊天室」

 

這時候就可以坐等用戶的連接,接下來小帥b再跟你說下如何實現聊天室的客戶端,如何讓人們進來吹水。

 

客戶端的實現

 

一般來說,客戶端的操作越傻瓜式越好,我們主要實現這樣的功能:

 

  • 用戶可以運行一個聊天室軟件
  • 可以在里面看到所有聊天室用戶的消息
  • 自己可以編輯消息進行發送

 

我們可以使用 tkinter 這個庫來寫一些 Python 的 GUI ,也就是客戶端的聊天界面,首先導入 tk 庫,然后定義一下標題:

用 Python 開發一個 「聊天室」

 

運行一下就是這樣的:

用 Python 開發一個 「聊天室」

 

創建聊天界面布局

 

創建面板

 

接下來我們來創建聊天界面的布局,先定義三個面板,分別是用來看消息的面板,輸入消息的面板,以及發送消息的面板:

用 Python 開發一個 「聊天室」

 

創建文本和按鈕

 

消息面板和發送消息面板都是 Text , 而發送的操作需要用到 Button:

用 Python 開發一個 「聊天室」

 

容器位置排放

 

消息窗口位于第 1 行,消息輸入窗口位于第 2 行,發送按鈕位于第三行:

用 Python 開發一個 「聊天室」

 

固定容器大小

 

可以使用 grid_propagate 來固定各個面板的大小:

用 Python 開發一個 「聊天室」

 

文本按鈕添加到容器中

 

最后將剛剛定義的 text 和 Button 弄進來:

用 Python 開發一個 「聊天室」

 

運行一下:

用 Python 開發一個 「聊天室」

 

這樣我們的聊天界面就做好了,接下來需要綁定一下事件,也就是說,當我們點擊發送按鈕的時候,應該要觸發一個事件,我們可以通過這個時間將輸入框中的內容發送給 socket 服務端。

 

發送事件綁定

 

我們可以在剛剛定義的 Button 中使用 command 參數來綁定方法,從而實現點擊發送按鈕時候的觸發:

用 Python 開發一個 「聊天室」

 

這里我們定義的名稱是 send , 所以我們可以定義一個 send 方法來進一步操作:

用 Python 開發一個 「聊天室」

 

當我們點擊按鈕的時候就會觸發這個方法:

用 Python 開發一個 「聊天室」

 

ok,那么接下來就是在 send 方法中獲取輸入框中的內容,發送給 socket ,然后再清空輸入框中的內容:

用 Python 開發一個 「聊天室」

 

我們先把獲取和清空實現下看看:

用 Python 開發一個 「聊天室」

 

ok,沒問題之后,我們就開始接入 socket 。

 

Socket 的接入

 

像我們之前說的那樣,定義一下連接的 socket 地址信息,然后創建連接:

用 Python 開發一個 「聊天室」

 

接著可以創建線程來接收服務器發過來的消息:

用 Python 開發一個 「聊天室」

 

將服務器獲取到的消息展示到消息面板中:

用 Python 開發一個 「聊天室」

 

Socket 消息發送

 

我們再回到剛剛定義的 send 方法,把要發送的消息通過 socket 發送過去:

用 Python 開發一個 「聊天室」

 

運行聊天室

 

接下來我們就來運行一下我們寫的聊天室,首先運行我們寫的 socket 服務端:

用 Python 開發一個 「聊天室」

 

接著開啟客戶端:

用 Python 開發一個 「聊天室」

 

連接正常,這時候已經可以交互了,我們再打開一個客戶端:

用 Python 開發一個 「聊天室」

 

可以接收到消息了,我們讓他們聊起來看看:

用 Python 開發一個 「聊天室」

 

ok,這樣聊天室的主要功能就實現啦,當然還有一些小地方的界面可以優化,這篇主要還是跟你說說 socket 的應用,本文首發于 fxxkpython ,更多精彩來看。

 

那么,我們下回見,peace!

分享到:
標簽:Python
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定