基于python socketserver框架全面解析
socketserver框架是一個(gè)基本的socket服務(wù)器端框架, 使用了threading來(lái)處理多個(gè)客戶端的連接, 使用seletor模塊來(lái)處理高并發(fā)訪問, 是值得一看的python 標(biāo)準(zhǔn)庫(kù)的源碼之一
對(duì)于select網(wǎng)絡(luò)框架的理解可以看 << 基于python select.select模塊通信的實(shí)例講解 >>。socketserver框架采用了selector框架來(lái)供你選擇相適應(yīng)的網(wǎng)絡(luò)通信框架, 比如select, poll, epoll等。有了這些網(wǎng)絡(luò)框架我們就能處理高并發(fā)的網(wǎng)絡(luò)訪問了.
先看看示例代碼吧:
# coding: utf-8 import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): """ The request handler class for our server. It is instantiated once per connection to the server, and must override the handle() method to implement communication to the client. """ def handle(self): # self.request is the TCP socket connected to the client self.data = self.request.recv(1024).strip() print("{} wrote:".format(self.client_address[0])) print(self.data) # just send back the same data, but upper-cased self.request.sendall(self.data.upper()) if __name__ == "__main__": HOST, PORT = "localhost", 9999 # Create the server, binding to localhost on port 9999 # 如果子類沒有某個(gè)方法或是屬性, 就回去父類中調(diào)用 with socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler) as server: # Activate the server; this will keep running until you # interrupt the program with Ctrl-C server.serve_forever()
客戶端:
# coding: utf-8 import socket sk = socket.socket() sk.connect(("127.0.0.1", 9999)) # 主動(dòng)初始化與服務(wù)器端的連接 while True: send_data = input("輸入發(fā)送內(nèi)容:") sk.sendall(bytes(send_data, encoding="utf8")) if send_data == "byebye": break accept_data = str(sk.recv(1024), encoding="utf8") print("".join(("接收內(nèi)容:", accept_data))) sk.close()
我們創(chuàng)建一個(gè)繼承自BaseRequestHandler類的TCP請(qǐng)求處理類, 說白了這個(gè)類就是我們自己封裝的基于socket的recv()函數(shù)與send()函數(shù)的類, 而所謂的TCP請(qǐng)求處理類其實(shí)就是對(duì)socket服務(wù)器端的bind, listen, accept等處理的封裝類, 而且這個(gè)封裝的并不是簡(jiǎn)單的socket, 而是基于select或是epoll等網(wǎng)絡(luò)框架的類, 我們調(diào)用這個(gè)類就能輕易地處理高并發(fā)的網(wǎng)絡(luò)訪問. 其實(shí)認(rèn)真閱讀源碼, 你會(huì)發(fā)現(xiàn)整體的程序設(shè)計(jì)是基于事件驅(qū)動(dòng)的, 事件驅(qū)動(dòng)機(jī)制的三個(gè)要素: 消息(事件)隊(duì)列, 消息(事件)觸發(fā), 事件循環(huán)。只不過socketserver框架的事件驅(qū)動(dòng)機(jī)制就做到了socket的accept()方法那, 接下來(lái)的消息接受(recv)與發(fā)送(send)就沒有在做封裝成相應(yīng)的事件來(lái)進(jìn)行處理了。
在這里說一個(gè)要注意的地方, 我使用了ThreadingTCPServer()類響應(yīng)多個(gè)客戶端的連接, 但是當(dāng)我閱讀這個(gè)類的源碼的時(shí)候, 表示很疑惑?。?/p>
class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
這讓我很疑惑啊,再看看調(diào)用:
with socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler) as server: # Activate the server; this will keep running until you # interrupt the program with Ctrl-C server.serve_forever()
這更疑惑, ThreadingTCPServer哪來(lái)的構(gòu)造函數(shù), 后來(lái)研究了一下, 原來(lái)當(dāng)子類的某個(gè)函數(shù)或是屬性發(fā)生調(diào)用時(shí), 如果不是重載了父類的方法或是屬性, 而且子類中沒有這個(gè)方法或是屬性, 就會(huì)去調(diào)用父類相對(duì)應(yīng)的方法或是屬性, 于是上面的就是調(diào)用了TCPServer的初始化函數(shù)__init__以及serve_forever(), 隨后調(diào)用的是子類的Request_handler函數(shù)
程序結(jié)果:
以上這篇基于python socketserver框架全面解析就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Python使用socketServer包搭建簡(jiǎn)易服務(wù)器過程詳解
- python網(wǎng)絡(luò)編程:socketserver的基本使用方法實(shí)例分析
- Python探索之SocketServer詳解
- 利用Python中SocketServer 實(shí)現(xiàn)客戶端與服務(wù)器間非阻塞通信
- Python使用SocketServer模塊編寫基本服務(wù)器程序的教程
- 實(shí)例講解Python中SocketServer模塊處理網(wǎng)絡(luò)請(qǐng)求的用法
- python網(wǎng)絡(luò)編程之TCP通信實(shí)例和socketserver框架使用例子
- Python網(wǎng)絡(luò)編程之socket與socketserver
相關(guān)文章
python 實(shí)現(xiàn)刪除文件或文件夾實(shí)例詳解
這篇文章主要介紹了python 實(shí)現(xiàn)刪除文件或文件夾實(shí)例詳解的相關(guān)資料,這里附有實(shí)例代碼,需要的朋友可以參考下2016-12-12使用Python實(shí)現(xiàn)炫酷的數(shù)據(jù)動(dòng)態(tài)圖大全
數(shù)據(jù)可視化是通過圖形、圖表、地圖等可視元素將數(shù)據(jù)呈現(xiàn)出來(lái),以便更容易理解、分析和解釋,它是將抽象的數(shù)據(jù)轉(zhuǎn)化為直觀形象的過程,本文給大家介紹了使用Python實(shí)現(xiàn)炫酷的數(shù)據(jù)動(dòng)態(tài)圖大全,需要的朋友可以參考下2024-06-06多線程python的實(shí)現(xiàn)及多線程有序性
這篇文章主要介紹了多線程python的實(shí)現(xiàn)及多線程有序性,多線程一般用于同時(shí)調(diào)用多個(gè)函數(shù),cpu時(shí)間片輪流分配給多個(gè)任務(wù)2022-06-06Python實(shí)現(xiàn)考試自動(dòng)答題的腳本分享
最近這段時(shí)間天氣正正好,不冷不熱,是學(xué)習(xí)考駕照的好時(shí)機(jī)。為了幫助大家能夠順利獲得駕照,小編為大家準(zhǔn)備了駕照考試的自動(dòng)答題小程序,希望對(duì)大家有所幫助2023-03-03對(duì)python append 與淺拷貝的實(shí)例講解
今天小編就為大家分享一篇對(duì)python append 與淺拷貝的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-05-05Python中八種數(shù)據(jù)導(dǎo)入方法總結(jié)
數(shù)據(jù)分析過程中,需要對(duì)獲取到的數(shù)據(jù)進(jìn)行分析,往往第一步就是導(dǎo)入數(shù)據(jù)。導(dǎo)入數(shù)據(jù)有很多方式,不同的數(shù)據(jù)文件需要用到不同的導(dǎo)入方式,相同的文件也會(huì)有幾種不同的導(dǎo)入方式。下面總結(jié)幾種常用的文件導(dǎo)入方法2022-11-11解決多個(gè)@Scheduled定時(shí)任務(wù)執(zhí)行時(shí)個(gè)別不執(zhí)行問題
這篇文章主要介紹了解決多個(gè)@Scheduled定時(shí)任務(wù)執(zhí)行時(shí)個(gè)別不執(zhí)行問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08利用Python通過商品條形碼查詢商品信息的實(shí)現(xiàn)示例
這篇文章主要介紹了利用Python通過商品條形碼查詢商品信息,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Python?jieba庫(kù)文本處理詞性標(biāo)注和關(guān)鍵詞提取進(jìn)行文本情感分析
這篇文章主要為大家介紹了Python使用中文文本處理利器jieba庫(kù)中的詞性標(biāo)注和關(guān)鍵詞提取功能進(jìn)行文本情感分析實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12