python D29 socketserver以及FTB
生活随笔
收集整理的這篇文章主要介紹了
python D29 socketserver以及FTB
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、socketserver
基于tcp協議下的socket只能和一個客戶端通信,如果用socketserver可以實現和多個客戶端通信。
他是在socket的基礎上進行封裝,也就是說底層還是調用的socket,在py2.7里面叫做SocketServer也就是大寫了兩個S,在py3里面就小寫了。后面我們要寫的FTP作業,需要用它來實現并發,也就是同時可以和多個客戶端進行通信,多個人可以同時進行上傳下載等。
socketserversocketserver源碼分析:
在整個socketserver這個模塊中,其實就干了兩件事情:1、一個是循環建立鏈接的部分,每個客戶鏈接都可以連接成功 2、一個通訊循環的部分,就是每個客戶端鏈接成功之后,要循環的和客戶端進行通信。看代碼中的:server=socketserver.ThreadingTCPServer(('127.0.0.1',8090),MyServer)
還記得面向對象的繼承嗎?來,大家自己嘗試著看看源碼:
查找屬性的順序:ThreadingTCPServer->ThreadingMixIn->TCPServer->BaseServer實例化得到server,先找ThreadMinxIn中的__init__方法,發現沒有init方法,然后找類ThreadingTCPServer的__init__,在TCPServer中找到,在里面創建了socket對象,進而執行server_bind(相當于bind),server_active(點進去看執行了listen) 找server下的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', <socket.socket fd=200, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8080)>)self.client_address即客戶端地址
一套完整的socketserver代碼示例:
server端 mport socketserver class Myserver(socketserver.BaseRequestHandler):def handle(self):self.data = self.request.recv(1024).strip()print("{} wrote:".format(self.client_address[0]))print(self.data)self.request.sendall(self.data.upper())if __name__ == "__main__":HOST, PORT = "127.0.0.1", 9999# 設置allow_reuse_address允許服務器重用地址socketserver.TCPServer.allow_reuse_address = True# 創建一個server, 將服務地址綁定到127.0.0.1:9999#server = socketserver.TCPServer((HOST, PORT),Myserver)server = socketserver.ThreadingTCPServer((HOST, PORT),Myserver)# 讓server永遠運行下去,除非強制停止程序server.serve_forever() socketserver_server端
client端
import socketHOST, PORT = "127.0.0.1", 9999 data = "hello"# 創建一個socket鏈接,SOCK_STREAM代表使用TCP協議 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:sock.connect((HOST, PORT)) # 鏈接到客戶端sock.sendall(bytes(data + "\n", "utf-8")) # 向服務端發送數據received = str(sock.recv(1024), "utf-8")# 從服務端接收數據print("Sent: {}".format(data)) print("Received: {}".format(received)) socketserver_client端轉載于:https://www.cnblogs.com/z520h123/p/10022165.html
總結
以上是生活随笔為你收集整理的python D29 socketserver以及FTB的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到牙掉了一个是什么意思
- 下一篇: 梦到一盆屎是什么意思