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

首頁(yè) > 編程 > Python > 正文

實(shí)例講解Python中SocketServer模塊處理網(wǎng)絡(luò)請(qǐng)求的用法

2019-11-25 16:41:23
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

SocketServer創(chuàng)建一個(gè)網(wǎng)絡(luò)服務(wù)框架。它定義了類(lèi)來(lái)處理TCP,UDP, UNIX streams 和UNIX datagrams上的同步網(wǎng)絡(luò)請(qǐng)求。

一、Server Types

有五個(gè)不同的服務(wù)器類(lèi)在SocketServer中。

1.BaseServer定義了API, 而且他不是用來(lái)實(shí)例化和直接使用的。
2.TCPServer用作TCP/IP的socket通訊。
3.UDPServer使用datagram sockets。
4.UnixStreamServer和UnixDatagramServer使用Unix-domain sockets而且智能在unix平臺(tái)上使用。

二、Server Objects

構(gòu)建一個(gè)服務(wù)器, 通過(guò)它來(lái)監(jiān)聽(tīng)請(qǐng)求的地址和請(qǐng)求的處理類(lèi)(not instance)。

1.class SocketServer.BaseServer
這是模塊中所有服務(wù)器對(duì)象的超類(lèi),它定義了接口,實(shí)現(xiàn)大多數(shù)都在子類(lèi)中完成。

2.BaseServer.fileno

返回一個(gè)整數(shù)文件描述符來(lái)表示哪個(gè)服務(wù)器正在監(jiān)聽(tīng)。這個(gè)函數(shù)最常見(jiàn)的傳遞給select.select(),允許監(jiān)控多個(gè)相同處理過(guò)程的服務(wù)。

3.BaseServer.handle_request

處理單一的請(qǐng)求,這個(gè)函數(shù)會(huì)順序調(diào)用接下來(lái)的方法。get_request(),verify_request和proccess_request。
用戶提供handle()方法拋出一個(gè)異常,那么handle_error()方法會(huì)被調(diào)用。
self.timeout的時(shí)間內(nèi)沒(méi)有收到請(qǐng)求,handle_timeout()和handle_request()將返回。

4.BaseServer.serve_forever

BaseServer.serve_forever(poll_interval=0.5),處理請(qǐng)求一直到明確的shutdown()請(qǐng)求。輪訓(xùn)每隔poll_interval時(shí)間內(nèi)關(guān)閉。忽略self.timeout,如果需要使用定時(shí)任務(wù),需要使用其他線程。

5.BaseServer.shutdown

告訴serve_forever()循環(huán)停止。

6.BaseServer.RequestHandlerClass

用戶請(qǐng)求處理程序類(lèi),為每個(gè)請(qǐng)求創(chuàng)建這個(gè)類(lèi)的一個(gè)實(shí)例。

三、Implementing a Server

如果你創(chuàng)建一個(gè)服務(wù)器,它通常可以重復(fù)使用現(xiàn)有的類(lèi)和簡(jiǎn)單的提供一個(gè)自定義請(qǐng)求處理的類(lèi)。如果不符合需求,有幾種BaseServer方法覆蓋一個(gè)子類(lèi)。

1.verify_request(reqeust, client_address): 必須返回一個(gè)布爾值,如果返回True,請(qǐng)求將被處理,如果返回False,請(qǐng)求將被拒絕。這個(gè)函數(shù)可以覆蓋來(lái)實(shí)現(xiàn)訪問(wèn)控制服務(wù)。
2.process_request(request, client_address): 調(diào)用finish_request來(lái)創(chuàng)建一個(gè)RequestHandlerClass()的實(shí)例,如果需要該函數(shù)可以創(chuàng)建一個(gè)新的進(jìn)程或協(xié)程來(lái)處理請(qǐng)求。
3.finish_request(request, client_address): 創(chuàng)建一個(gè)請(qǐng)求處理實(shí)例。調(diào)用handle()來(lái)處理請(qǐng)求。

四、Request Handlers

請(qǐng)求處理程序做的大部分工作接收傳入的請(qǐng)求,并決定采取何種行動(dòng)。處理程序負(fù)責(zé)實(shí)現(xiàn)“協(xié)議”上的套接字層(例如,HTTP或xml - rpc)。從傳入的請(qǐng)求處理程序讀取請(qǐng)求數(shù)據(jù)通道,流程,和寫(xiě)一個(gè)響應(yīng)。有三個(gè)方法可以重寫(xiě)。

1.setup(): 準(zhǔn)備請(qǐng)求的請(qǐng)求處理程序, 就是初始化運(yùn)行在handle之前。
2.handle(): 做真正的請(qǐng)求工作。解析傳入的請(qǐng)求,處理數(shù)據(jù)和返回響應(yīng)。
3.finish(): 清理任意時(shí)間創(chuàng)建的setup()。

五、例子

下面例子展示了tcp, udp和異步

1.TCPServer 例子

import SocketServerclass MyHandler(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 = 'localhost', 9999  server = SocketServer.TCPServer((HOST, PORT), MyHandler)  server.serve_forever()

2.UDPServr 例子

import SocketServerclass MyHandler(SocketServer.BaseRequestHandler):  def handle(self):    data = self.request[0].strip()    socket = self.request[1]    print '{} wrote:'.format(self.client_address[0])    print data    socket.sendto(data.upper(), self.client_address)if __name__ == '__main__':  HOST, PORT = 'localhost', 9999  server = SocketServer.UDPServer((HOST, PORT), MyHandler)  server.serve_forever()

3.異步例子

可以通過(guò)ThreadingMixIn和ForkingMixIn類(lèi)來(lái)構(gòu)造異步處理程序。

import socketimport threadingimport SocketServerclass MyHandler(SocketServer.BaseRequestHandler):  def handle(self):    data = self.request.recv(1024)    curr_thread = threading.current_thread()    response = '{}: {}'.format(curr_thread.name, data)    self.request.sendall(response)class Server(SocketServer.ThreadingMixIn, SocketServer.TCPServer):  passdef client(ip, port, message):  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  sock.connect((ip, port))  try:    sock.sendall(message)    response = sock.recv(1024)    print 'Received: {}'.format(response)  finally:    sock.close()if __name__ == '__main__':  HOST, PORT = 'localhost', 0  server = Server((HOST, PORT), MyHandler)  ip, port = server.server_address  serer_thread = threading.Thread(target=server.serve_forever)  server_thread.daemon = True  server_thread.start()  print 'Server loop running in thread:', server_thread.name  client(ip, port, 'Hello World 1')  client(ip, port, 'Hello World 2')  client(ip, port, 'Hello World 3')  server.shutdown()  server.server_close()

4.SocketServer 實(shí)現(xiàn)客戶端與服務(wù)器間非阻塞通信
(1)創(chuàng)建SocketServerTCP服務(wù)端

#創(chuàng)建SocketServerTCP服務(wù)器: import SocketServer from SocketServer import StreamRequestHandler as SRH from time import ctime  host = 'xxx.xxx.xxx.xxx' port = 9999 addr = (host,port)  class Servers(SRH):   def handle(self):     print 'got connection from ',self.client_address     self.wfile.write('connection %s:%s at %s succeed!' % (host,port,ctime()))     while True:       data = self.request.recv(1024)       if not data:          break       print data       print "RECV from ", self.client_address[0]       self.request.send(data) print 'server is running....' server = SocketServer.ThreadingTCPServer(addr,Servers) server.serve_forever() 

(2)創(chuàng)建SocketServerTCP客戶端

from socket import *  host = 'xxx.xxx.xxx.xxx' port = 9999 bufsize = 1024 addr = (host,port) client = socket(AF_INET,SOCK_STREAM) client.connect(addr) while True:   data = raw_input()   if not data or data=='exit':     break   client.send('%s/r/n' % data)   data = client.recv(bufsize)   if not data:     break   print data.strip() client.close() 

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 青田县| 辽阳市| 江都市| 阿拉善左旗| 永宁县| 年辖:市辖区| 吉林省| 西华县| 唐河县| 焉耆| 江山市| 龙里县| 株洲市| 新宁县| 吉林市| 双柏县| 泸溪县| 易门县| 布拖县| 谷城县| 蕉岭县| 博客| 华坪县| 远安县| 同仁县| 陵川县| 城步| 开平市| 新源县| 蒙自县| 大庆市| 龙南县| 和平县| 清苑县| 镇坪县| 九寨沟县| 玉屏| 类乌齐县| 仪征市| 遂川县| 阳山县|