python 基礎之socket程式設計(三)
前面實現的基於socket通訊只能實現什麼呢?在tcp協議的通訊中就是乙個使用者說一句,服務端給你回一句,你再給服務端說一句,服務端再給你回一句,就這樣一直友好的玩耍下去了。等等,又有乙個使用者來了,他呢也想和和服務端進行一下交流,於是他就給服務端傳送了一條訊息,之後等呀等不知過了多久,任然沒有等到服務端給他發揮的訊息,只有什麼時候他就可以和服務端愉快的玩耍了呢?這個就需要第乙個使用者退出和伺服器的鏈結,此時第二個客戶端才會和服務端建立起鏈結,此時此刻,他才能和服務端愉快的玩耍。當然有人會說,tcp不求行,那可以用udp 搞嘛,這個可以做,不過呢,資料丟失了我找你要呀。so,今天使用python提供的乙個模組來實現併發的效果,這個模組是啥呢?沒錯就是socketserver.
基於tcp的套接字,實質就是兩個迴圈,乙個迴圈實現連線;乙個迴圈實現通訊。
socketserver內部使用 io多路復用 以及 「多執行緒」 和 「多程序」 ,從而實現併發處理多個客戶端請求的socket服務端。即:每個客戶端請求連線到伺服器時,socket服務端都會在伺服器是建立乙個「執行緒」或者「程序」 專門負責處理當前客戶端的所有請求。底層還是對socket進行了封裝和加入執行緒、程序就實現了socketserver,後面會對socketserver原始碼分析。
以下述**為例,分析socketserver原始碼:
1 f=socketserver.threadingtcpserver(('查詢屬性的順序:threadingtcpserver->threadingmixin->tcpserver->baseserver:127.0.0.1
',8080),myserver)
2 f.serve_forever()
例項化得到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)
(data)
self.request.send(data.upper())
#將客戶端發來的單詞全部大寫後回覆給客戶端
if__name__ == '
__main__':
f = socketserver.threadingtcpserver(('
127.0.0.1
', 8080), myserver)
f.serve_forever()
import客戶端1,2socket
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)
(data)
client.close()
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是在應用層和...