搜尋
首頁後端開發Python教學Python 中的 TCP 聊天室

TCP Chatroom in Python

介紹

在這篇部落格中,我們將使用 Python 實作一個功能齊全的 TCP 聊天室。我們將擁有一台伺服器來託管房間,以及多個客戶端連接到它並相互通信。

關於 TCP 和客戶端伺服器架構

傳輸控制協議是一種面向連接的通訊協議,有助於透過網路在不同設備之間交換訊息。

為了實現我們的聊天室,我們將使用客戶端-伺服器架構。這意味著我們將擁有多個客戶端(使用者)和一台中央伺服器來託管所有內容並為這些客戶端提供資料。


設定伺服器(server.py)

1.為了設定我們的基礎伺服器,我們需要匯入兩個函式庫,也就是套接字和執行緒。套接字庫將用於建立和設定網路連線,執行緒庫是同時執行各種任務所必需的。

import socket
import threading

2. 下一個任務是定義我們的伺服器資料並初始化我們的套接字。我們需要主機的 IP 位址和伺服器的可用連接埠號碼。在本部落格中,我們將使用位址 127.0.0.1,即我們的 localhost 和連接埠 5500

連接埠號碼無關緊要,但您必須確保您使用的連接埠是免費且未保留。如果您在實際伺服器或虛擬機器上執行此聊天室,請將聊天室伺服器的 IP 位址指定為虛擬機器或伺服器的主機 IP 位址

查看此保留連接埠號碼清單以取得更多資訊。

# Server Data
host = '127.0.0.1'
port = 5500

3. 當我們定義套接字時,我們需要傳遞兩個參數。這些定義了我們要使用的套接字類型。第一個 (AF_INET) 顯示我們使用的是互聯網套接字而不是 unix 套接字。第二個參數代表我們要使用的協定。 SOCK_STREAM 表示我們正在使用 TCP。

定義套接字後,我們透過傳遞包含這兩個值的元組將其綁定或附加到我們的主機和指定連接埠。然後我們將伺服器置於監聽模式,以便它等待客戶端連接並發送訊息..

# Start the Server
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host, port))
server.listen()

4.我們還將建立兩個空列表,稍後我們將用它們來儲存連接的客戶端及其暱稱。

import socket
import threading

5.現在我們將定義所有有助於我們廣播訊息的函數。它將向每個連接的客戶端發送一條訊息,因此會出現在客戶端清單中。

# Server Data
host = '127.0.0.1'
port = 5500

6.現在我們將建立一個handle()函數。該函數將負責處理來自客戶端的消息。該函數將在 while 循環中運行。該函數將接受客戶端作為參數並無限循環地處理它,直到發生錯誤或客戶端本身斷開連接。

# Start the Server
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host, port))
server.listen()

7. 現在我們必須接收來自客戶端的訊息並將其廣播給所有連接的客戶端。因此,當一個客戶端發送一條訊息時,其他人都可以透過broadcast()函數看到該訊息。現在,如果由於某種原因與該用戶端的連線出現錯誤,我們將刪除它及其暱稱,關閉連線並廣播該用戶端已離開聊天。

# Lists For Clients and Their Nicknames
clients = []
nicknames = []

當我們準備好運行我們的伺服器時,我們將執行這個接收函數。一旦客戶端連接到伺服器,它就會向伺服器發送字串“NAME”,這將告訴客戶端請求其暱稱。之後,它等待回應並將具有相應暱稱的客戶端附加到清單中,並為該特定客戶端的handle()函數啟動一個線程。

8. 現在我們可以運行這個函數,我們的伺服器就完成了。

# Sending Messages To All Connected Clients
def broadcast(message):
    for client in clients:
        client.send(message)

設定客戶端(client.py)

現在我們要實現我們的客戶端。為此,我們將再次需要導入相同的庫。

# Handling Clients
def handle(client):
    while True:
        try:
            # Broadcasting Messages
            message = client.recv(1024)
            broadcast(message)
        except:
            # Removing And Closing Clients
            index = clients.index(client)
            clients.remove(client)
            client.close()
            nickname = nicknames[index]
            broadcast('{} left!'.format(nickname).encode('ascii'))
            nicknames.remove(nickname)
            break

1. 客戶端的第一步是選擇暱稱並連接到我們的伺服器。我們需要知道伺服器運行的確切位址和連接埠。作為客戶端,我們連接到現有伺服器,而不是綁定資料和監聽。

# Receiving `Function
def receive():
    while True:
        # Accept Connection
        client, address = server.accept()
        print("Connected with {}".format(str(address)))

        # Request And Store Nickname
        client.send('NAME'.encode('ascii'))
        nickname = client.recv(1024).decode('ascii')
        nicknames.append(nickname)
        clients.append(client)

        # Print And Broadcast Nickname
        print("Nickname is {}".format(nickname))
        broadcast("{} joined!".format(nickname).encode('ascii'))
        client.send('Connected to server!'.encode('ascii'))

        # Start Handling Thread For Client
        thread = threading.Thread(target=handle, args=(client,))
        thread.start()

2. 現在,客戶端需要有兩個同時執行的執行緒。第一個將不斷從伺服器接收數據,第二個將向伺服器發送我們自己的訊息。

receive()

這裡又出現了一個無限的 while 迴圈。它不斷嘗試接收訊息並將其列印到螢幕上。但是,如果訊息是“NAME”,它不會列印它,而是將其暱稱發送到伺服器。

書寫功能相當短。它還以無限循環運行,始終等待用戶的輸入。一旦獲得一些,它就會將其與暱稱結合並發送給伺服器。

3.我們需要做的最後一件事是啟動兩個運行這兩個函數的執行緒。

import socket
import threading

現在我們完成了。我們有一個功能齊全的伺服器和可以連接到它並相互通訊的工作客戶端。


運行聊天室

我們來測試一下吧。請記住,我們始終需要先啟動伺服器,否則客戶端無法連接到不存在的主機。

*伺服器日誌:*

# Server Data
host = '127.0.0.1'
port = 5500

*客戶端一日誌:*

# Start the Server
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host, port))
server.listen()

*客戶端二日誌:*

# Lists For Clients and Their Nicknames
clients = []
nicknames = []

我們已經成功地用Python創建了一個基於傳輸控制協定的聊天室! ? ?

在此處找到完整程式碼:https://github.com/rajatuiwebdev/tcp-chatroom-in-python
在 Instagram 上追蹤我: https://instagram.com/rajatrajput.dev
在 LinkedIn 上追蹤我: https://linkedin.com/in/rajatrajput2004

以上是Python 中的 TCP 聊天室的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
您如何將元素附加到Python數組?您如何將元素附加到Python數組?Apr 30, 2025 am 12:19 AM

Inpython,YouAppendElementStoAlistusingTheAppend()方法。 1)useappend()forsingleelements:my_list.append(4).2)useextend()orextend()或= formultiplelements:my_list.extend.extend(emote_list)ormy_list = [4,5,6] .3)useInsert()forspefificpositions:my_list.insert(1,5).beaware

您如何調試與Shebang有關的問題?您如何調試與Shebang有關的問題?Apr 30, 2025 am 12:17 AM

調試shebang問題的方法包括:1.檢查shebang行確保是腳本首行且無前置空格;2.驗證解釋器路徑是否正確;3.直接調用解釋器運行腳本以隔離shebang問題;4.使用strace或truss跟踪系統調用;5.檢查環境變量對shebang的影響。

如何從python數組中刪除元素?如何從python數組中刪除元素?Apr 30, 2025 am 12:16 AM

pythonlistscanbemanipulationusseveralmethodstoremovelements:1)theremove()MethodRemovestHefirStocCurrenceOfAstePecificiedValue.2)thepop()thepop()methodRemovesandReturnturnturnturnsanaNelementAgivenIndex.3)

可以在Python列表中存儲哪些數據類型?可以在Python列表中存儲哪些數據類型?Apr 30, 2025 am 12:07 AM

pythonlistscanstoreanydatate型,包括素,弦,浮子,布爾人,其他列表和迪克尼亞式

在Python列表上可以執行哪些常見操作?在Python列表上可以執行哪些常見操作?Apr 30, 2025 am 12:01 AM

pythristssupportnumeroferations:1)addingElementSwithAppend(),Extend(),andInsert()。 2)emovingItemSusingRemove(),pop(),andclear(),and clear()。 3)訪問andModifyingandmodifyingwithIndexingandSlicing.4)

如何使用numpy創建多維數組?如何使用numpy創建多維數組?Apr 29, 2025 am 12:27 AM

使用NumPy創建多維數組可以通過以下步驟實現:1)使用numpy.array()函數創建數組,例如np.array([[1,2,3],[4,5,6]])創建2D數組;2)使用np.zeros(),np.ones(),np.random.random()等函數創建特定值填充的數組;3)理解數組的shape和size屬性,確保子數組長度一致,避免錯誤;4)使用np.reshape()函數改變數組形狀;5)注意內存使用,確保代碼清晰高效。

說明Numpy陣列中'廣播”的概念。說明Numpy陣列中'廣播”的概念。Apr 29, 2025 am 12:23 AM

播放innumpyisamethodtoperformoperationsonArraySofDifferentsHapesbyAutapityallate AligningThem.itSimplifififiesCode,增強可讀性,和Boostsperformance.Shere'shore'showitworks:1)較小的ArraySaraySaraysAraySaraySaraySaraySarePaddedDedWiteWithOnestOmatchDimentions.2)

說明如何在列表,Array.Array和用於數據存儲的Numpy數組之間進行選擇。說明如何在列表,Array.Array和用於數據存儲的Numpy數組之間進行選擇。Apr 29, 2025 am 12:20 AM

forpythondataTastorage,choselistsforflexibilityWithMixedDatatypes,array.ArrayFormeMory-effficityHomogeneousnumericalData,andnumpyArraysForAdvancedNumericalComputing.listsareversareversareversareversArversatilebutlessEbutlesseftlesseftlesseftlessforefforefforefforefforefforefforefforefforefforlargenumerdataSets; arrayoffray.array.array.array.array.array.ersersamiddreddregro

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器