国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

基于python socketserver框架全面解析

2020-01-04 16:46:38
字體:
來源:轉載
供稿:網友

socketserver框架是一個基本的socket服務器端框架, 使用了threading來處理多個客戶端的連接, 使用seletor模塊來處理高并發訪問, 是值得一看的python 標準庫的源碼之一

對于select網絡框架的理解可以看 << 基于python select.select模塊通信的實例講解 >>。socketserver框架采用了selector框架來供你選擇相適應的網絡通信框架, 比如select, poll, epoll等。有了這些網絡框架我們就能處理高并發的網絡訪問了.

先看看示例代碼吧:

# coding: utf-8import socketserverclass 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 # 如果子類沒有某個方法或是屬性, 就回去父類中調用 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-8import socketsk = socket.socket()sk.connect(("127.0.0.1", 9999)) # 主動初始化與服務器端的連接while True: send_data = input("輸入發送內容:") sk.sendall(bytes(send_data, encoding="utf8")) if send_data == "byebye":  break accept_data = str(sk.recv(1024), encoding="utf8") print("".join(("接收內容:", accept_data)))sk.close()

我們創建一個繼承自BaseRequestHandler類的TCP請求處理類, 說白了這個類就是我們自己封裝的基于socket的recv()函數與send()函數的類, 而所謂的TCP請求處理類其實就是對socket服務器端的bind, listen, accept等處理的封裝類, 而且這個封裝的并不是簡單的socket, 而是基于select或是epoll等網絡框架的類, 我們調用這個類就能輕易地處理高并發的網絡訪問. 其實認真閱讀源碼, 你會發現整體的程序設計是基于事件驅動的, 事件驅動機制的三個要素: 消息(事件)隊列, 消息(事件)觸發, 事件循環。只不過socketserver框架的事件驅動機制就做到了socket的accept()方法那, 接下來的消息接受(recv)與發送(send)就沒有在做封裝成相應的事件來進行處理了。

在這里說一個要注意的地方, 我使用了ThreadingTCPServer()類響應多個客戶端的連接, 但是當我閱讀這個類的源碼的時候, 表示很疑惑啊!

class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass

這讓我很疑惑啊,再看看調用:

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哪來的構造函數, 后來研究了一下, 原來當子類的某個函數或是屬性發生調用時, 如果不是重載了父類的方法或是屬性, 而且子類中沒有這個方法或是屬性, 就會去調用父類相對應的方法或是屬性, 于是上面的就是調用了TCPServer的初始化函數__init__以及serve_forever(), 隨后調用的是子類的Request_handler函數

程序結果:

python,socketserver框架

python,socketserver框架

以上這篇基于python socketserver框架全面解析就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吴桥县| 海南省| 鲁甸县| 武定县| 巴楚县| 新昌县| 博客| 谢通门县| 兰州市| 溆浦县| 裕民县| 龙山县| 县级市| 西宁市| 密山市| 大理市| 姜堰市| 翁牛特旗| 江津市| 瓦房店市| 双辽市| 馆陶县| 维西| 剑川县| 贵溪市| 汤阴县| 惠安县| 广安市| 中西区| 阿拉善右旗| 贡觉县| 溧水县| 卢龙县| 客服| 沭阳县| 仙桃市| 辽源市| 寿光市| 化州市| 措美县| 余庆县|