Python入門基礎之socket多線程編程,TCP伺服器和客戶端通信

2020-12-15 碼不完的代碼

在上一篇文章中,我介紹了一下python3 socket編程的基礎,包括TCP、UDP客戶端和伺服器的建立過程(連結在最下方)。不過那個只是單線程的,伺服器一次只能和一個客戶端會話,多個客戶端的話只能等待。我們平時的應用中,伺服器肯定是要並發的,所以,今天將介紹socket編程的多線程編程。一個伺服器同時和多個客戶端建立會話。

多線程原理:TCP伺服器會創建一個線程池,每當有客戶端請求連接的時候,它便會從線程池中分配一個線程同客戶端建立連接,當客戶端中斷連接後,線程便銷毀。

SocketServer 模塊

在python中,socket多線程並發的實現主要是利用SocketServer模塊實現的。客戶端比較簡單,一般只用socket就可以,伺服器端複雜些,用socketserver或者Twisted 框架等,本篇主要講SocketServer。 SocketServer 是標準庫中一個高級別的模塊。用於簡化網絡客戶與伺服器的實現。

socketserver模塊中分兩大類:server類(解決連接問題)和request類(解決通信問題)

server類:

Request類:

類的描述如下:

SocketServerTCP伺服器:

這裡我們用到了類,因為多線程就可以利用面向對象了,每一次連接,不過是實現了一個實例。類我前面也講過了有興趣可以看一下。

在代碼中,先導入我們的伺服器類,然後像之前一樣定義主機常量。主機常量後就是我們的請求處理器類,然後是啟動代碼。

伺服器和客戶端建立連接的步驟我就不寫了,上一篇文章中有。

不廢話了,上代碼:

伺服器端:

代碼解釋:

我們從 SocketServer 的 StreamRequestHandler 類中派生出一個子類,並重寫 handle()函數。

在有客戶消息進來的時候,handle()函數就會被調用。StreamRequestHandler 類支持像操作文件對象那樣操作輸入輸出套接字。用request.recv()函數接收消息。因為socketserver是封裝好的模塊,我們不需要對其初始化連接。其中self.request self.client_address等於socket中 conn,addr = socket.accept(),只不過在socketserver模塊中已經替我們包裝好了,還替我們包裝了包括bind()、listen()、accept()方法(不懂得看我前面文章,連接在下面)。

代碼中間部分就是接收客戶端消息,並返回給客戶端。

代碼的最後部分用給定的主機信息和請求處理類創建 TCP 伺服器。然後進入等待客戶請求與處理客戶請求的無限循環中。

客戶端:

客戶端非常簡單,就是簡單socket編程。代碼和上一篇中的都一樣,就是多了一個異常處理。步驟就是昨天我發的文章裡面的

上一篇文章:Python入門基礎之網絡編程、socket編程、TCP、UDP編程

面向對象:乾貨!Python入門基礎之面向對象二:類和實例、方法

碼字不易,多多關注。

相關焦點

  • Python編程:微信群聊程序的開發與進/線程知識匯總(附代碼)
    本文承接上篇文章的客戶端—伺服器聊天對話程序,進一步設計開發了微信群聊的python模擬程序,涉及的python知識點為:Python實戰:聊天軟體開發與TCP/Socket編程知識匯總(附代碼)和 進程與線程編程!
  • Linux進程間通信的socketpair()函數
    它的參數與socket()類似,只是多了一個int sv[2]項用於返回這兩個文件描述符,返回值用於提示創建是否成功。而socket()函數的返回值就是文件描述符,用返回-1提示失敗。上圖為它的man手冊。
  • 35 張圖解被問千百遍的 TCP 三次握手和四次揮手面試題
    UDP 支持一對一、一對多、多對多的交互通信3. 可靠性TCP 是可靠交付數據的,數據可以無差錯、不丟失、不重複、按需到達。基於 TCP 協議的客戶端和伺服器工作服務端和客戶端初始化 socket,得到文件描述符;服務端調用 bind,將綁定在 IP 地址和埠;服務端調用 listen,進行監聽;
  • java網絡編程之基礎知識點總結
    概述本文是網絡編程系列的第一篇文章,所以不講代碼,主要是網絡編程的一些基礎知識,下面的這些知識點主要是對java網絡編程這本書的歸納與整理。有興趣的同學可以看看。我們知道計算機之間的通信要經過一系列複雜的過程,計算機之間通過傳輸介質、通信設施和網絡通信協議互聯,實現資源共享和數據傳輸。
  • 單機伺服器最大並發的TCP連接數到底是多少,你被騙很久!
    本文轉載自【微信公眾號:小碼逆襲,ID:gh_7c5a039380a0】經微信公眾號授權轉載,如需轉載與原文作者聯繫曾幾何時我們還在尋求網絡編程中C10K問題的解決方案,但是現在從硬體和作業系統支持來看單臺伺服器支持上萬並發連接已經沒有多少挑戰性了。
  • 淺析Linux Socket套接字編程中的 5 個隱患
    隱患 3.地址使用錯誤(EADDRINUSE)您可以使用 bind API 函數來綁定一個地址(一個接口和一個埠)到一個套接字端點。可以在伺服器設置中使用這個函數,以便限制可能有連接到來的接口。也可以在客戶端設置中使用這個函數,以便限制應當供出去的連接所使用的接口。
  • Python開發簡單爬蟲【學習資料總結】
    語言基礎:(帶你熟悉python語言的特性,學會使用python開發環境,使用python開發一些簡單的案例) (1)Python3入門,數據類型,字符串 (2)判斷/循環語句,函數, (3)類與對象,繼承,多態 (4)tkinter界面編程
  • Python基礎進階之海量表情包多線程爬蟲功能的實現
    這篇文章主要介紹了Python基礎進階之海量表情包多線程爬蟲,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑑價值,需要的朋友可以參考下一、前言在我們日常聊天的過程中會使用大量的表情包
  • 另類的Python學習路線「非編程系必備」
    後來想一想其實還是很有必要,因為我想也許有很多人和我一樣想走近這門程式語言,而那些大咖的分享往往都是站在一個制高點上,雖然很有道理卻有很多不切和我們這些非科班出身的人。這篇指南是我在Python學習小有成就,並能通過Python編程小賺一筆的情況下,對於3年的斷斷續續python學習作出的學習指南。
  • 網際網路編程如何入門,學習路徑又是什麼?
    今天給大家來講一講網際網路學習編程以及如何入門等相關知識。1.先學會C++和socket或者windows的http server api做一個http server,做一個小網站。2.多加幾個網頁後,你就會比較的明白為什麼的大家總是需要一個template語言工具了,然後可以自己去試一試,做出一個。
  • 【系統編程】你所不知道的TIME_WAIT和CLOSE_WAIT(上)
    大家知道,由於socket是全雙工的工作模式,一個socket的關閉,是需要四次握手來完成的。大家經常提socket,那麼,到底什麼是一個socket?其實,socket就是一個 五元組,包括:源IP、源埠、目的IP、目的埠、類型:TCP或者UDP這個五元組,即標識了一條可用的連接。注意,有很多人把一個socket定義成四元組,也就是 源IP:源埠 + 目的IP:目的埠,這個定義是不正確的。
  • 電腦入門程式語言
    今天和大家介紹一下電腦入門編程學什麼語言更合適。首選python語言,python 是一門開源免費、通用型的腳本程式語言,現在社會上會python語言的人很吃香的。它上手簡單,功能強大,堅持「極簡主義」。
  • TCP通信過程中遇到粘包拆包解決全過程
    在使用TCP協議進行通信時,聽到最多的也就是粘包和拆包問題。本文就來看看,如何解決粘包和拆包問題。因此服務端和客戶端進行數據傳遞的時候,要制定好拆包規則。客戶端按照該規則進行粘包,服務端按照該規則拆包。如果有任意違背該規則,服務端就不能拿到預期的數據。1. 解決思路(三種) 1. 在發送的數據包中添加頭,在頭⾥存儲數據的⼤⼩,服務端就可以按照此⼤⼩來讀取數據,這樣就知道界限在哪⾥了。
  • 那些讓人驚豔的Python庫
    每一門技藝都是入門容易熟悉難,越是了解,越是感覺到自己的欠缺,在python博大精深的世界裡,這些蔚為壯觀的python庫,也只能算是滄海一粟。Flask-OAuthlib–OAuth 1.0/a, 2.0客戶端實現,供Flask使用。OAuthLib–一個OAuth請求-籤名邏輯通用、完整的實現。python-oauth2–一個完全測試的抽象接口。用來創建OAuth客戶端和服務端。python-social-auth–一個設置簡單的社會化驗證方式。
  • 學習Python要知道哪些重要的庫和工具
    httplib2:全面的 HTTP 客戶端庫。treq:類似 requests 的 Python API 構建於 Twisted HTTP 客戶端之上。urllib3:一個具有線程安全連接池,支持文件 post,清晰友好的 HTTP 庫。資料庫Python 實現的資料庫。資料庫驅動用來連接和操作資料庫的庫。
  • 從一個HTTP請求來讀懂HTTP、TCP協議
    DNS也是臺伺服器也有自己的ip地址,這時候應用層會構造一個DNS請求報文,應用層會去調用傳輸層的接口一個socket的API,DNS默認使用UDP實現數據傳輸,即應用層調用傳輸層的API,傳輸層會在DNS請求報文基礎上加一個UDP的請求頭,傳輸層將數據交給網絡層,網絡層同樣在UDP請求報文基礎上加IP的請求頭,網絡層會將IP請求報文交給數據鏈路層,數據鏈路層會將自己的mac頭加上去並把對應的請求報文交給下一個機器的
  • 網絡連接存在大量time_wait和close_wait的原因以及解決方法
    四次揮手過程:第一次揮手:主機A(可以是客戶端,也可以是伺服器端),設置Sequence Number和Acknowledgment Number,向主機B發送一個FIN報文段;此時,主機A進入FIN_WAIT_1狀態;這表示主機A沒有數據要發送給主機