最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用SocketServer模塊編寫基本服務器程序的教程

 更新時間:2016年07月12日 18:04:37   作者:duhaizhang  
SocketServer模塊中集成了實現(xiàn)socket通信服務器功能所需的各種類和方法,這里我們就來看一下Python使用SocketServer模塊編寫基本服務器程序的教程:

SocketServer簡化了網(wǎng)絡服務器的編寫。它有4個類:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer。這4個類是同步進行處理的,另外通過ForkingMixIn和ThreadingMixIn類來支持異步。

創(chuàng)建服務器的步驟。首先,你必須創(chuàng)建一個請求處理類,它是BaseRequestHandler的子類并重載其handle()方法。其次,你必須實例化一個服務器類,傳入服務器的地址和請求處理程序類。最后,調(diào)用handle_request()(一般是調(diào)用其他事件循環(huán)或者使用select())或serve_forever()。

集成ThreadingMixIn類時需要處理異常關閉。daemon_threads指示服務器是否要等待線程終止,要是線程互相獨立,必須要設置為True,默認是False。

無論用什么網(wǎng)絡協(xié)議,服務器類有相同的外部方法和屬性。

在Python3中,本模塊為socketserver模塊。在Python 2中,本模塊為SocketServer模塊。所以在用import導入時,要分情況導入,否則會報錯。導入的代碼如下:

try:
  import socketserver   #Python 3
except ImportError:
  import SocketServer   #Python 2

SocketSerror模塊包括許多可以簡化TCP、UDP、UNIX域套接字  服務器實現(xiàn)的類。

一、處理程序
要使用本模塊,必須定義一個繼承于基類BaseRequestHandler的處理程序類。BaseRequestHandler類的實例h可以實現(xiàn)以下方法:
1、h.handle()  調(diào)用該方法執(zhí)行實際的請求操作。調(diào)用該函數(shù)可以不帶任何參數(shù),但是幾個實例變量包含有用的值。h.request包含請求,h.client_address包含客戶端地址,h.server包含調(diào)用處理程序的實例。對于TCP之類的數(shù)據(jù)流服務,h.request屬性是套接字對象。對于數(shù)據(jù)報服務,它是包含收到數(shù)據(jù)的字節(jié)字符串。
2、h.setup()   該方法在handle()之前調(diào)用。默認情況下,它不執(zhí)行任何操作。如果希望服務器實現(xiàn)更多連接設置(如建立SSL連接),可以在這里實現(xiàn)。
3、h.finish()   調(diào)用本方法可以在執(zhí)行完handle()之后執(zhí)行清除操作。默認情況下,它不執(zhí)行任何操作。如果setup()和handle()方法都不生成異常,則無需調(diào)用該方法。
如果知道應用程序只能操縱面向數(shù)據(jù)流的連接(如TCP),那么應從StreamRequestHandler繼承,而不是BaseRequestHandler。StreamRequestHandler類設置了兩個屬性,h.wfile是將數(shù)據(jù)寫入客戶端的類文件對象,h.rfile是從客戶端讀取數(shù)據(jù)的類文件對象。
如果要編寫針對數(shù)據(jù)包操作的處理程序并將響應持續(xù)返回發(fā)送方,那么它應當從DatagramRequestHandler繼承。它提供的類接口與StramRequestHandler相同。

二、服務器
要使用處理程序,必須將其插入到服務器對象。定義了四個基本的服務器類。
(1)TCPServer(address,handler)   支持使用IPv4的TCP協(xié)議的服務器,address是一個(host,port)元組。Handler是BaseRequestHandler或StreamRequestHandler類的子類的實例。
(2)UDPServer(address,handler)   支持使用IPv4的UDP協(xié)議的服務器,address和handler與TCPServer中類似。
(3)UnixStreamServer(address,handler)   使用UNIX域套接字實現(xiàn)面向數(shù)據(jù)流協(xié)議的服務器,繼承自TCPServer。
(4)UnixDatagramServer(address,handler)  使用UNIX域套接字實現(xiàn)數(shù)據(jù)報協(xié)議的服務器,繼承自UDPServer。
所有四個服務器類的實例都有以下方法和變量:
1、s.socket   用于傳入請求的套接字對象。
2、s.sever_address  監(jiān)聽服務器的地址。如元組("127.0.0.1",80)
3、s.RequestHandlerClass   傳遞給服務器構造函數(shù)并由用戶提供的請求處理程序類。
4、s.serve_forever()  處理無限的請求
5、s.shutdown()   停止serve_forever()循環(huán)
6、s.fileno()   返回服務器套接字的整數(shù)文件描述符。該方法可以有效地通過輪詢操作(如select()函數(shù))使用服務器實例。

三、定義自定義服務器
服務器往往需要特殊的配置來處理不同的網(wǎng)絡地址族、超時期、并發(fā)和其他功能,可以通過繼承上面四個基本服務器類來自行定義。
可以通過混合類獲得更多服務器功能,這也是通過進程或線程分支添加并發(fā)行的方法。為了實現(xiàn)并發(fā)性,定義了以下類:
(1)ForkingMixIn         將UNIX進程分支添加到服務器的混合方法,使用該方法可以讓服務器服務多個客戶。
(2)ThreadingMixIn    修改服務器的混合類,可以使用線程服務多個客戶端。
要向服務器添加這些功能,可以使用多重繼承,其中首先列出混了類。
由于并發(fā)服務器很常用,為了定義它,SocketServer預定義了以下服務器類:
(1)ForkingUDPServer(address,handler)  
(2)ForkingTCPServer(address,handler)
(3)ThreadingUDPServer(address,handler)
(4)ThreadingTCPServer(address,handler)
上面有點亂,現(xiàn)總結以下:
SocketServer模塊中的類主要有以下幾個:
1、BaseServer    包含服務器的核心功能與混合類(mix-in)的鉤子功能。這個類主要用于派生,不要直接生成這個類的類對象,可以考慮使用TCPServer和UDPServer類。
2、TCPServer    基本的網(wǎng)絡同步TCP服務器
3、UDPServer    基本的網(wǎng)絡同步UDP服務器
4、ForkingMixIn   實現(xiàn)了核心的進程化功能,用于與服務器類進行混合(mix-in),以提供一些異步特性。不要直接生成這個類的對象。
5、ThreadingMixIn   實現(xiàn)了核心的線程化功能,用于與服務器類進行混合(mix-in),以提供一些異步特性。不要直接生成這個類的對象。
6、ForkingTCPServer     ForkingMixIn與TCPServer的組合
7、ForkingUDPServer    ForkingMixIn與UDPServer的組合
8、BaseRequestHandler
9、StreamRequestHandler    TCP請求處理類的一個實現(xiàn)
10、DataStreamRequestHandler   UDP請求處理類的一個實現(xiàn)
現(xiàn)在繁雜的事務都已經(jīng)封裝到類中了,直接使用類即可。

四、實例
1.使用SocketServer模塊編寫的TCP服務器端代碼:

#! /usr/bin/env python
#coding=utf-8
"""使用SocketServer來實現(xiàn)簡單的TCP服務器"""
from SocketServer import (TCPServer,StreamRequestHandler as SRH)
from time import ctime
class MyRequestHandler(SRH):
  def handle(self):
    print "connected from ",self.client_address
    self.wfile.write("[%s] %s" %(ctime(),self.rfile.readline()))
tcpSer=TCPServer(("",10001),MyRequestHandler)
print "waiting for connection"
tcpSer.serve_forever()
相應的TCP客戶端代碼:
#! /usr/bin/env python
#coding=utf-8
from socket import *
BUFSIZE=1024
#每次都要創(chuàng)建新的連接
while True:
  tcpClient=socket(AF_INET,SOCK_STREAM)
  tcpClient.connect(("localhost",10001))
  data=raw_input(">")
  if not data:
    break
  tcpClient.send("%s\r\n" %data)
  data1=tcpClient.recv(BUFSIZE)
  if not data1:
    break
  print data1.strip()
  tcpClient.close()

2.異步服務器的實現(xiàn)

ThreadingMixIn的例子:

import socketimport threadingimport SocketServerclass ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):

  def handle(self):
    data = self.request.recv(1024)
    cur_thread = threading.current_thread()
    response = "{}: {}".format(cur_thread.name, data)
    self.request.sendall(response)class ThreadedTCPServer(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__":
  # Port 0 means to select an arbitrary unused port
  HOST, PORT = "localhost", 0

  server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
  ip, port = server.server_address  # Start a thread with the server -- that thread will then start one
  # more thread for each request
  server_thread = threading.Thread(target=server.serve_forever)
  # Exit the server thread when the main thread terminates
  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()

執(zhí)行結果:

$ python ThreadedTCPServer.py
Server loop running in thread: Thread-1
Received: Thread-2: Hello World 1
Received: Thread-3: Hello World 2
Received: Thread-4: Hello World 3

相關文章

  • Python迭代器與生成器及作用示例詳解

    Python迭代器與生成器及作用示例詳解

    Python生成器在內(nèi)存管理、延遲計算、生成無限序列以及提高代碼簡潔性和可讀性方面都具有重要作用,這篇文章主要介紹了Python迭代器與生成器示例詳解,需要的朋友可以參考下
    2024-02-02
  • Python實現(xiàn)從線程獲取返回值

    Python實現(xiàn)從線程獲取返回值

    本文介紹了Python中線程的概念、創(chuàng)建線程的方法和在線程中獲取函數(shù)返回值的技巧,線程作為進程中的執(zhí)行單元,可以實現(xiàn)程序的并發(fā)運行,文章通過示例代碼展示了如何在Python中使用Thread類創(chuàng)建線程,并講解了在線程中傳遞參數(shù)和獲取返回值的方法
    2024-09-09
  • python3中的函數(shù)與參數(shù)及空值問題

    python3中的函數(shù)與參數(shù)及空值問題

    這篇文章主要介紹了python3-函數(shù)與參數(shù)以及空值,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-11-11
  • 詳解Python字符串切片

    詳解Python字符串切片

    這篇文章主要介紹了Python字符串切片,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • Python?pip更新的兩種方式詳解

    Python?pip更新的兩種方式詳解

    Pip是用于管理Python軟件包的常用命令,Pip命令還用于更新/升級已經(jīng)安裝的Python軟件包,下面這篇文章主要給大家介紹了關于Python?pip更新的兩種方式,需要的朋友可以參考下
    2023-02-02
  • 計算機二級python學習教程(1) 教大家如何學習python

    計算機二級python學習教程(1) 教大家如何學習python

    這篇文章主要為大家詳細介紹了計算機二級python學習教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • python實現(xiàn)單機五子棋

    python實現(xiàn)單機五子棋

    這篇文章主要為大家詳細介紹了python實現(xiàn)單機五子棋,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • Python中的pathlib庫使用詳解

    Python中的pathlib庫使用詳解

    今天給大家介紹Python中的pathlib庫的操作方法,pathlib?是Python內(nèi)置庫,pathlib庫對于目錄路徑的操作更簡潔也更貼近?Pythonic(Python代碼風格的),對Python?pathlib庫相關知識感興趣的朋友一起看看吧
    2022-05-05
  • pytorch中如何使用DataLoader對數(shù)據(jù)集進行批處理的方法

    pytorch中如何使用DataLoader對數(shù)據(jù)集進行批處理的方法

    這篇文章主要介紹了pytorch中如何使用DataLoader對數(shù)據(jù)集進行批處理的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • python中列表對象pop()方法的使用說明

    python中列表對象pop()方法的使用說明

    這篇文章主要介紹了python中列表對象pop()方法的使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評論

内江市| 岐山县| 上犹县| 礼泉县| 华阴市| 安吉县| 文安县| 永昌县| 梧州市| 兴国县| 彭阳县| 抚州市| 大同县| 绵阳市| 广平县| 化德县| 株洲县| 西宁市| 邹平县| 景洪市| 临安市| 巫溪县| 万州区| 松桃| 大丰市| 屯昌县| 昭通市| 固安县| 汝南县| 洛阳市| 祁阳县| 邹平县| 颍上县| 泰安市| 南通市| 乡宁县| 赤城县| 历史| 丰原市| 元阳县| 正安县|