1. socketserver 模块
    简化了网络服务器的编写,主要实现并发的处理.
  2.  
  3. 主要有4个类:这4个类是同步进行处理的,另外通过ForkingMixInThreadingMixIn类来支持异步。
    socketserver.TCPServer
    socketserver.UDPServer
    socketserver.UnixStreamServer
    socketserver.UnixDatagramServer
  4.  
  5. 创建服务器的步骤4步:
  1. 1:你必须创建一个请求处理类,它是BaseRequestHandler的子类并重载其handle()方法。
    2:你必须实例化一个服务器类,
    3:传入服务器的地址和请求处理程序类。
    4:调用handle_request()(一般是调用其他事件循环或者使用select())或serve_forever()。

    举例服务器端:
  1. import socketserver
  2. class MySocketHandler(socketserver.BaseRequestHandler):
  3. def handle(self):
  4. while True:
  5. try:
  6. self.data = self.request.recv(1024).strip()
  7. print(self.data)
  8. print('{}'.format(self.client_address[0]))
  9. self.request.send(self.data.upper())
  10. except ConnectionResetError as e:
  11. print('err',e)
  12. break
  13.  
  14. if __name__ == '__main__':
  15. host,port = 'localhost',9999
  16. # server = socketserver.TCPServer((host,port),MySocketHandler) # 只实现简化服务器端,支持一个客户端
  17. server = socketserver.ThreadingTCPServer((host,port),MySocketHandler) #多线程并发
  18. server.serve_forever()

客户端:

  1. import socket
  2.  
  3. client = socket.socket()
  4. client.connect(('localhost',9999))
  5. while True:
  6. mess = input('>>')
  7. client.send(mess.encode('utf-8'))
  8. data = client.recv(1024)
  9. print(data)
  1. 服务器类型
  2.  
  3. 5种类型:BaseServerTCPServerUnixStreamServerUDPServerUnixDatagramServer 注意:BaseServer不直接对外服务。
  4.  
  5. 服务器对象
  6.  
  7. class SocketServer.BaseServer:这是模块中的所有服务器对象的超类。它定义了接口,如下所述,但是大多数的方法不实现,在子类中进行细化。
  8.  
  9. BaseServer.fileno():返回服务器监听套接字的整数文件描述符。通常用来传递给select.select(), 以允许一个进程监视多个服务器。
  10.  
  11. BaseServer.handle_request():处理单个请求。处理顺序:get_request(), verify_request(), process_request()。如果用户提供handle()方法抛出异常,
    将调用服务器的handle_error()方法。如果self.timeout内没有请求收到, 将调用handle_timeout()并返回handle_request()。
  12.  
  13. BaseServer.serve_forever(poll_interval=0.5): 处理请求,直到一个明确的shutdown()请求。每poll_interval秒轮询一次shutdown。忽略self.timeout
    如果你需要做周期性的任务,建议放置在其他线程。
  14.  
  15. BaseServer.shutdown():告诉serve_forever()循环停止并等待其停止。python2.6版本。
  16.  
  17. BaseServer.address_family: 地址家族,比如socket.AF_INETsocket.AF_UNIX
  18.  
  19. BaseServer.RequestHandlerClass:用户提供的请求处理类,这个类为每个请求创建实例。
  20.  
  21. BaseServer.server_address:服务器侦听的地址。格式根据协议家族地址的各不相同,请参阅socket模块的文档。
  22.  
  23. BaseServer.socketSocket:服务器上侦听传入的请求socket对象的服务器。
  24.  
  25. 服务器类支持下面的类变量:
  26.  
  27. BaseServer.allow_reuse_address:服务器是否允许地址的重用。默认为false ,并且可在子类中更改。
  28.  
  29. BaseServer.request_queue_size
  30.  
  31. 请求队列的大小。如果单个请求需要很长的时间来处理,服务器忙时请求被放置到队列中,最多可以放request_queue_size个。一旦队列已满,
    来自客户端的请求将得到 Connection denied”错误。默认值通常为5 ,但可以被子类覆盖。
  32.  
  33. BaseServer.socket_type:服务器使用的套接字类型; socket.SOCK_STREAMsocket.SOCK_DGRAM等。
  34.  
  35. BaseServer.timeout:超时时间,以秒为单位,或 None表示没有超时。如果handle_request()在timeout内没有收到请求,将调用handle_timeout()。
  36.  
  37. 下面方法可以被子类重载,它们对服务器对象的外部用户没有影响。
  38.  
  39. BaseServer.finish_request():实际处理RequestHandlerClass发起的请求并调用其handle()方法。 常用。
  40.  
  41. BaseServer.get_request():接受socket请求,并返回二元组包含要用于与客户端通信的新socket对象,以及客户端的地址。
  42.  
  43. BaseServer.handle_error(request, client_address):如果RequestHandlerClasshandle()方法抛出异常时调用。默认操作是打印traceback到标准输出,并继续处理其他请求。
  44.  
  45. BaseServer.handle_timeout():超时处理。默认对于forking服务器是收集退出的子进程状态,threading服务器则什么都不做。
  46.  
  47. BaseServer.process_request(request, client_address) :调用finish_request()创建RequestHandlerClass的实例。如果需要,此功能可以创建新的进程或线程来处理请求,
    ForkingMixInThreadingMixIn类做到这点。常用。
  48.  
  49. BaseServer.server_activate():通过服务器的构造函数来激活服务器。默认的行为只是监听服务器套接字。可重载。
  50.  
  51. BaseServer.server_bind():通过服务器的构造函数中调用绑定socket到所需的地址。可重载。
  52.  
  53. BaseServer.verify_request(request, client_address):返回一个布尔值,如果该值为True ,则该请求将被处理,反之请求将被拒绝。此功能可以重写来实现对服务器的访问控制。
    默认的实现始终返回Trueclient_address可以限定客户端,比如只处理指定ip区间的请求。 常用。
  54.  
  55. 请求处理器(重要)
  56.  
  57. 处理器接收数据并决定如何操作。它负责在socket层之上实现协议(i.e., HTTP, XML-RPC, or AMQP),读取数据,处理并写反应。可以重载的方法如下:
  58.  
  59. setup(): 准备请求处理. 默认什么都不做,StreamRequestHandler中会创建文件类似的对象以读写socket.
  60.  
  61. handle(): 处理请求。解析传入的请求,处理数据,并发送响应。默认什么都不做。常用变量:self.requestself.client_addressself.server
  62.  
  63. finish(): 环境清理。默认什么都不做,如果setup产生异常,不会执行finish
    通常只需要重载handleself.request的类型和数据报或流的服务不同。对于流服务,self.requestsocket 对象;对于数据报服务,self.request是字符串和socket
    可以在子类StreamRequestHandlerDatagramRequestHandler中重载,重写setup()和finish() ,并提供self.rfileself.wfile属性。 self.rfileself.wfile可以读取或写入,
    以获得请求数据或将数据返回到客户端。
  1. 参考TCPServer.py
  1. import SocketServerclass MyTCPHandler(SocketServer.BaseRequestHandler):
  2. """
  3. The RequestHandler class for our server.
  4.  
  5. It is instantiated once per connection to the server, and must
  6. override the handle() method to implement communication to the
  7. client.
  8. """
  9.  
  10. def handle(self):
  11. # self.request is the TCP socket connected to the client
  12. self.data = self.request.recv(1024).strip()
  13. print "{} wrote:".format(self.client_address[0])
  14. print self.data # just send back the same data, but upper-cased
  15. self.request.sendall(self.data.upper())if __name__ == "__main__":
  16. HOST, PORT = "localhost", 9999
  17.  
  18. # Create the server, binding to localhost on port 9999
  19. server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
  20.  
  21. # Activate the server; this will keep running until you
  22. # interrupt the program with Ctrl-C
  23. server.serve_forever()
  1. 参考UDPServer.py
  1. import SocketServerclass MyUDPHandler(SocketServer.BaseRequestHandler):
  2. """
  3. This class works similar to the TCP handler class, except that
  4. self.request consists of a pair of data and client socket, and since
  5. there is no connection the client address must be given explicitly
  6. when sending data back via sendto().
  7. """
  8.  
  9. def handle(self):
  10. data = self.request[0].strip()
  11. socket = self.request[1]
  12. print "{} wrote:".format(self.client_address[0])
  13. print data
  14. socket.sendto(data.upper(), self.client_address)if __name__ == "__main__":
  15. HOST, PORT = "localhost", 9999
  16. server = SocketServer.UDPServer((HOST, PORT), MyUDPHandler)
  17. server.serve_forever()

python学习之-- socketserver模块的更多相关文章

  1. Python学习 Part4:模块

    Python学习 Part4:模块 1. 模块是将定义保存在一个文件中的方法,然后在脚本中或解释器的交互实例中使用.模块中的定义可以被导入到其他模块或者main模块. 模块就是一个包含Python定义 ...

  2. python学习之argparse模块

    python学习之argparse模块 一.简介: argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块.argparse模块的作用是用于解析命令行 ...

  3. Python学习day19-常用模块之re模块

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  4. Python学习day18-常用模块之NumPy

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  5. python学习之random模块

    Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...

  6. Python学习笔记之模块与包

    一.模块 1.模块的概念 模块这一概念很大程度上是为了解决代码的可重用性而出现的,其实这一概念并没有多复杂,简单来说不过是一个后缀为 .py 的 Python 文件而已 例如,我在某个工作中经常需要打 ...

  7. python网络编程socketserver模块(实现TCP客户端/服务器)

    摘录python核心编程 socketserver(python3.x版本重新命名)是标准库中的网络编程的高级模块.通过将创建网络客户端和服务器所必须的代码封装起来,简化了模板,为你提供了各种各样的类 ...

  8. Python学习笔记-常用模块

    1.python模块 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失.因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作 ...

  9. Python学习笔记1—模块

    模块的使用 引用模块的两种形式 形式一: import module_name 形式二: from module1 import module11   (module11是module的子模块) 例: ...

随机推荐

  1. java中异常处理finally和return语句的执行顺序

    finally代码块的语句在return之前一定会得到执行 如果try块中有return语句,finally代码块没有return语句,那么try块中的return语句在返回之前会先将要返回的值保存, ...

  2. EJB2的配置

    1. ejb-jar.xml <?xml version="1.0" encoding="UTF-8"?> <ejb-jar xmlns=&q ...

  3. http接口调用,传递json格式带双引号问题

    springmvc 配置好会自动转换json格式,只要配置他转格式之前,在转次String类型就好

  4. Django请求,响应,ajax以及CSRF问题

    二.request对象常用属性: Attribute Description path 请求页面的全路径,不包括域名端口参数.例如: /users/index method 一个全大写的字符串,表示请 ...

  5. JavaScript-基础类型和运算符

    JavaScript-基础类型和运算符 P02.稍微了解 1.js代码需要编写到script标签中 <script type="text/javascript"> 此处 ...

  6. Windows API函数大全(完整)

    Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一 ...

  7. 摄像头调用代码 笔记本的话,本身有一个摄像头,由于用的usb摄像头,需要把笔记本的摄像头禁用后,再使用

    摄像头调用代码 笔记本的话,本身有一个摄像头,由于用的usb摄像头,需要把笔记本的摄像头禁用后,再使用 <!DOCTYPE html> <html lang="en&quo ...

  8. 多表单异步验证 可以用 Promise validate

    https://www.jb51.net/article/140062.htm vue动态绑定组件子父组件多表单验证功能的实现代码 // 加载组件:每次下拉框监听则给changValue新赋值,如果下 ...

  9. lodash中文说明文档

    lodash中文说明文档 https://www.css88.com/doc/lodash/

  10. faster rcnn的改进方向

    http://blog.csdn.net/linolzhang/article/details/74159463 http://blog.csdn.net/linolzhang/article/det ...