欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2016年06月28日 15:20:47   作者:cangmean  
SocketServer模塊中帶有很多實(shí)現(xiàn)服務(wù)器所能夠用到的socket類和操作方法,下面我們就來以實(shí)例講解Python中SocketServer模塊處理網(wǎng)絡(luò)請求的用法:

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

一、Server Types

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

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

二、Server Objects

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

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

2.BaseServer.fileno

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

3.BaseServer.handle_request

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

4.BaseServer.serve_forever

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

5.BaseServer.shutdown

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

6.BaseServer.RequestHandlerClass

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

三、Implementing a Server

如果你創(chuàng)建一個(gè)服務(wù)器,它通??梢灾貜?fù)使用現(xiàn)有的類和簡單的提供一個(gè)自定義請求處理的類。如果不符合需求,有幾種BaseServer方法覆蓋一個(gè)子類。

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

四、Request Handlers

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

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

五、例子

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

1.TCPServer 例子

import SocketServer


class 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 SocketServer


class 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.異步例子

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

import socket
import threading
import SocketServer


class 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):
  pass


def 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() 

相關(guān)文章

  • 對python3 Serial 串口助手的接收讀取數(shù)據(jù)方法詳解

    對python3 Serial 串口助手的接收讀取數(shù)據(jù)方法詳解

    今天小編就為大家分享一篇對python3 Serial 串口助手的接收讀取數(shù)據(jù)方法詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • django rest framework之請求與響應(yīng)(詳解)

    django rest framework之請求與響應(yīng)(詳解)

    下面小編就為大家?guī)硪黄猟jango rest framework之請求與響應(yīng)(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望對大家有所幫助
    2017-11-11
  • python看某個(gè)模塊的版本方法

    python看某個(gè)模塊的版本方法

    今天小編就為大家分享一篇python看某個(gè)模塊的版本方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • PyCharm-錯(cuò)誤-找不到指定文件python.exe的解決方法

    PyCharm-錯(cuò)誤-找不到指定文件python.exe的解決方法

    今天小編就為大家分享一篇PyCharm-錯(cuò)誤-找不到指定文件python.exe的解決方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python爬蟲動態(tài)ip代理防止被封的方法

    Python爬蟲動態(tài)ip代理防止被封的方法

    在本篇文章中小編給大家整理了關(guān)于Python爬蟲動態(tài)ip代理防止被封的方法以及實(shí)例代碼,需要的朋友們學(xué)習(xí)下。
    2019-07-07
  • python動態(tài)文本進(jìn)度條的實(shí)例代碼

    python動態(tài)文本進(jìn)度條的實(shí)例代碼

    這篇文章主要介紹了python動態(tài)文本進(jìn)度條的實(shí)例代碼,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • python3字符串輸出常見面試題總結(jié)

    python3字符串輸出常見面試題總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于python3字符串輸出常見面試題總結(jié)內(nèi)容,有需要的朋友們可以參考下。
    2020-12-12
  • Python標(biāo)準(zhǔn)庫calendar的使用方法

    Python標(biāo)準(zhǔn)庫calendar的使用方法

    本文主要介紹了Python標(biāo)準(zhǔn)庫calendar的使用方法,calendar模塊主要由Calendar類與一些模塊方法構(gòu)成,Calendar類又衍生了一些子孫類來幫助我們實(shí)現(xiàn)一些特殊的功能,感興趣的可以了解一下
    2021-11-11
  • python生成器/yield協(xié)程/gevent寫簡單的圖片下載器功能示例

    python生成器/yield協(xié)程/gevent寫簡單的圖片下載器功能示例

    這篇文章主要介紹了python生成器/yield協(xié)程/gevent寫簡單的圖片下載器功能,結(jié)合實(shí)例形式分析了python生成器、yield協(xié)程與gevent圖片下載器相關(guān)功能定義與使用技巧,需要的朋友可以參考下
    2019-10-10
  • Python中zipfile壓縮文件模塊的基本使用教程

    Python中zipfile壓縮文件模塊的基本使用教程

    這篇文章主要給大家介紹了關(guān)于Python中zipfile壓縮文件模塊的基本使用教程,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06

最新評論