Python 基礎之socket程式設計(三)

2022-08-11 22:18:14 字數 3240 閱讀 3236

python 基礎之socket程式設計(三)

前面實現的基於socket通訊只能實現什麼呢?在tcp協議的通訊中就是乙個使用者說一句,服務端給你回一句,你再給服務端說一句,服務端再給你回一句,就這樣一直友好的玩耍下去了。等等,又有乙個使用者來了,他呢也想和和服務端進行一下交流,於是他就給服務端傳送了一條訊息,之後等呀等不知過了多久,任然沒有等到服務端給他發揮的訊息,只有什麼時候他就可以和服務端愉快的玩耍了呢?這個就需要第乙個使用者退出和伺服器的鏈結,此時第二個客戶端才會和服務端建立起鏈結,此時此刻,他才能和服務端愉快的玩耍。當然有人會說,tcp不求行,那可以用udp 搞嘛,這個可以做,不過呢,資料丟失了我找你要呀。so,今天使用python提供的乙個模組來實現併發的效果,這個模組是啥呢?沒錯就是socketserver.

基於tcp的套接字,實質就是兩個迴圈,乙個迴圈實現連線;乙個迴圈實現通訊。

socketserver內部使用 io多路復用 以及 「多執行緒」 和 「多程序」 ,從而實現併發處理多個客戶端請求的socket服務端。即:每個客戶端請求連線到伺服器時,socket服務端都會在伺服器是建立乙個「執行緒」或者「程序」 專門負責處理當前客戶端的所有請求。底層還是對socket進行了封裝和加入執行緒、程序就實現了socketserver,後面會對socketserver原始碼分析。

以下述**為例,分析socketserver原始碼:

1 f=socketserver.threadingtcpserver(('

127.0.0.1

',8080),myserver)

2 f.serve_forever()

查詢屬性的順序:threadingtcpserver->threadingmixin->tcpserver->baseserver:

例項化得到f,先找類threadingtcpserver的__init__,在tcpserver中找到,進而執行server_bind,server_active

找f下的serve_forever,在baseserver中找到,進而執行self._handle_request_noblock(),該方法同樣是在baseserver中

執行self._handle_request_noblock()進而執行request, client_address = self.get_request()(就是tcpserver中的self.socket.accept()),然後執行self.process_request(request, client_address)

在threadingmixin中找到process_request,開啟多執行緒應對併發,進而執行process_request_thread,執行self.finish_request(request, client_address)

上述四部分完成了鏈結迴圈,本部分開始進入處理通訊部分,在baseserver中找到finish_request,觸發我們自己定義的類的例項化,去找__init__方法,而我們自己定義的類沒有該方法,則去它的父類也就是baserequesthandler中找....

原始碼分析總結:

基於tcp的socketserver我們自己定義的類中的

self.server即套接字物件

self.request即乙個鏈結

self.client_address即客戶端位址

基於udp的socketserver我們自己定義的類中的

self.request是乙個元組(第乙個元素是客戶端發來的資料,第二部分是服務端的udp套接字物件),如(b'adsf', )

self.client_address即客戶端位址

基於tcp的socketserver例項:

import

socketserver

class

myserver(socketserver.baserequesthandler):

defhandle(self):

print('

self:

', self)

print('

self.request:

', self.request)

while

true:

data = self.request.recv(1024)

print

(data)

self.request.send(data.upper())

#將客戶端發來的單詞全部大寫後回覆給客戶端

if__name__ == '

__main__':

f = socketserver.threadingtcpserver(('

127.0.0.1

', 8080), myserver)

f.serve_forever()

服務端

import

socket

client =socket.socket(socket.af_inet, socket.sock_stream)

client.connect((

'127.0.0.1

', 8080))

while true: #

通訊迴圈

msg = input('

>>>:

').strip()

ifnot msg: continue

client.send(msg.encode(

'utf-8'))

data = client.recv(1024)

print

(data)

client.close()

客戶端1,2

so,今天就這些了,接下來得去搞定搞定多使用者ftp小專案啦。

python之 socket 基礎篇

socket 網路模組 注意事項 在python3中,所有資料的傳輸必須用bytes型別 bytes只支援ascii碼 所以在傳送資料的時候要麼在傳送的字串前面加 b 要麼使用encode utf 8 進行轉換成bytes型別傳送,但是在接收端必須用decode 進行轉碼。套接字格式 socket ...

Python基礎之socket程式設計

1 硬體c s架構 印表機 2 軟體c s架構 網際網路中處處是c s 架構 如各種 的服務端,你的瀏覽器就是客戶端 b s架構也是c s 架構的一種 c s架構與socket的關係 我們學習socket就是為了完成c s架構的開發 為何學習socket一定要先學習網際網路協議 1 首先 本屆課程的...

網路基礎之socket

我們知道ip層的ip位址可以唯一標示主機,而tcp層協議和埠號可以唯一標示主機的乙個程序,這樣我們可以利用ip位址 協議 埠號唯一標示網路中的乙個程序。能夠唯一標示網路中的程序後,它們就可以利用socket進行通訊了.什麼是socket呢?我們經常把socket翻譯為套接字,socket是在應用層和...