Python3 socketserver模块
socketserver(在Python2.*中的是SocketServer模块)是标准库中一个高级别的模块。用于简化网络客户与服务器的实现(在前面使用socket的过程中,我们先设置了socket的类型,然后依次调用bind(),listen(),accept(),最后使用while循环来让服务器不断的接受请求。而这些步骤可以通过SocketServer包来简化。)。模块中,已经实现了一些可供使用的类。
我们将再次实现之前的那个基本TCP的例子。你会注意到新实现与之前有很多相似之处,但你也要注意到,现在很多繁杂的事情已经被封装好了,你不用再去关心那个样板代码了。例子给出的是一个最简单的同步服务器。
为了要隐藏实现的细节。我们现在写程序时会使用类,这是与之前代码的另一个不同。用面向对象的方法可以帮助我们更好的组织数据与逻辑功能。你也会注意到,我们的程序现在是“事件驱动”了。这就意味着,只有在事件出现的时候,程序才有“反应”。
在之前的服务循环中,我们阻塞等待请求,有请求来的时候就处理请求,然后再回去继续等待。现在的服务循环中,就不用在服务器里写代码了,改成定义一个处理器,服务器在收到进来的请求的时候,可以调用你的处理函数。
类 描述
BaseServer 包含服务器的核心功能与混合(mix-in)类的钩子功能。这个类用于派生,不要直接生成这个类的类对象,可以考虑使用 TCPServer 和UDPServer。
TCPServer/UDPServer 基本的网络同步 TCP/UDP 服务器
UnixStreamServer/ 基本的基于文件同步 TCP/UDP 服务器
UnixDatagramServer
ForkingMixIn/ 实现了核心的进程化或线程化的功能,用于与服务器类进行混合(mix-in),以提供一些异步特性。
ThreadingMixIn 不要直接生成这个类的对象
ForkingTCPServer/ ForkingMixIn 和 TCPServer/UDPServer 的组合
ForkingUDPServer
ThreadingTCPServer/ ThreadingMixIn 和 TCPServer/UDPServer 的组合
ThreadingUDPServer
BaseRequestHandler 包含处理服务请求的核心功能。只用于派生新的类,不要直接生成这个类的对象,可以考虑使用 StreamRequestHandler 或DatagramRequestHandler
StreamRequestHandler/ TCP/UDP 服务器的请求处理类的一个实现
DatagramRequestHandler
创建一个socketserverTCP服务器
- from socketserver import (TCPServer as TCP, StreamRequestHandler as SRH) #可以通过as起别名
- from time import ctime
- HOST = ''
- PORT = 1234
- ADDR = (HOST, PORT)
- class MyRequestHandler(SRH):
- def handle(self):
- print ('已经连接:', self.client_address)
- self.wfile.write(('[%s] %s' % (ctime(), self.rfile.readline().decode("UTF-8"))).encode("UTF-8"))
- tcpServ = TCP(ADDR, MyRequestHandler)
- print ('等待新的连接。。。。')
- tcpServ.serve_forever()
我们从socketserver的StreamRequestHandler类中派生出一个子类,并重写handle()函数。在BaseRequest
类中,这个函数什么也不做。在有客户消息进来的时候,handle()函数就会被调用。StreamRequestHandler
类支持像操作文件对象那样操作输入输出套接字。我们可以用readline()函数得到客户消息,用write()函数把字符串发给客户。
创建一个socketserverTCP客户端
- #coding=UTF-8
- from socket import *
- import sys
- reload (sys)
- sys.setdefaultencoding('utf8')
- HOST = '192.168.1.27'
- PORT = 1234
- BUFSIZE = 1024
- ADDR = (HOST, PORT)
- while True:
- tcpCliSock = socket(AF_INET, SOCK_STREAM)
- tcpCliSock.connect(ADDR)
- data = raw_input('>')
- if not data:
- break
- tcpCliSock.send('%s\r\n' % data.encode("UTF-8"))
- data = tcpCliSock.recv(BUFSIZE).decode("UTF-8")
- if not data:
- break
- print (data.strip())
- tcpCliSock.close()
使用socketserver处理多链接
上面的例子一次只能连接一个客户机并出力它的请求,如果要处理多连接问题,那么有三种主要的方法能实现这个目的:分叉(forking)、线程(threading)以及异步I/O(asynchronous
I/O)。通过对socketserver服务器使用混入类(mix-in
class),派生进程和线程很容易处理。即使要自己实现它们,这些方法也很容易使用。它们确实有缺点:分叉占据资源,并且如果有太多的客户端时分叉不能很好分叉(尽管如此,对于合理数量的客户端,分叉在现代的UNIX或者Linux系统中是很高效的,如果有一个多CPU系统,那系统效率会更高);线程处理能导致同步问题。使用socketserver框架创建分叉或者线程服务器非常简单:
分叉服务器:
- from socketserver import (TCPServer as TCP, StreamRequestHandler as SRH,ForkingMixIn as FMI) #变动位置
- from time import ctime
- HOST = ''
- PORT = 1234
- ADDR = (HOST, PORT)
- class Server(FMI, TCP): #变动位置
- pass
- class MyRequestHandler(SRH):
- def handle(self):
- print ('已经连接:', self.client_address)
- self.wfile.write(('[%s] %s' % (ctime(), self.rfile.readline().decode("UTF-8"))).encode("UTF-8"))
- tcpServ = Server(ADDR, MyRequestHandler) #变动位置
- print ('等待新的连接。。。。')
- tcpServ.serve_forever()
多线程SocketServer服务器:
- from socketserver import (TCPServer as TCP, StreamRequestHandler as SRH,ThreadingMixIn as TMI) #变动位置
- from time import ctime
- HOST = ''
- PORT = 1234
- ADDR = (HOST, PORT)
- class Server(TMI, TCP): #变动位置
- pass
- class MyRequestHandler(SRH):
- def handle(self):
- print ('已经连接:', self.client_address)
- self.wfile.write(('[%s] %s' % (ctime(), self.rfile.readline().decode("UTF-8"))).encode("UTF-8"))
- tcpServ = Server(ADDR, MyRequestHandler) #变动位置
- print ('等待新的连接。。。。')
- tcpServ.serve_forever()
Python3 socketserver模块的更多相关文章
- socketserver模块使用方法
一.socketserver模块介绍 Python提供了两个基本的socket模块.一个是socket,它提供了标准的BSD Socket API: 另一个是socketserver,它提供了服务器中 ...
- python网络编程socketserver模块(实现TCP客户端/服务器)
摘录python核心编程 socketserver(python3.x版本重新命名)是标准库中的网络编程的高级模块.通过将创建网络客户端和服务器所必须的代码封装起来,简化了模板,为你提供了各种各样的类 ...
- socketserver模块使用与源码分析
socketserver模块使用与源码分析 前言 在前面的学习中我们其实已经可以通过socket模块来建立我们的服务端,并且还介绍了关于TCP协议的粘包问题.但是还有一个非常大的问题就是我们所编写的S ...
- socket 和 SocketServer 模块
一 .Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket socket(TCP,IP)通常也称作"套接字",用于描述IP地址和端 ...
- SocketServer模块
在利用select实现伪并发的socket博文中我们说了: 如果要实现一个server端可以和多个客户端进行通信可以使用 1.多线程 2.多进程 3.select I/O多路复用 在那篇博文中我们介绍 ...
- 浅析python中socketserver模块使用
虽然说用python编写简单的网络程序狠方便,但是复杂一点的网络程序还是用现成的框架比较好,这样就可以专心事物逻辑,而不是套接字的各种细节.Socketserver模块简化了编写网络服务程序,同时so ...
- Python网络编程(2)-粘包现象及socketserver模块实现TCP并发
1. 基于Tcp的远程调用命令实现 很多人应该都使用过Xshell工具,这是一个远程连接工具,通过上面的知识,就可以模拟出Xshell远程连接服务器并调用命令的功能. Tcp服务端代码如下: impo ...
- Python之socketserver模块和验证客户端链接的合法性
验证客户端链接的合法性 分布式系统中实现一个简单的客户端链接认证功能 #_*_coding:utf-8_*_ from socket import * import hmac,os secret_ke ...
- python 内置标准库socketserver模块的思考
socketserver模块简化了编写网络服务器的任务, 在很大程度上封装了一些操作, 你可以看成是事件驱动型的设计, 这很不错.它定义了两个最基本的类--服务器类 BaseServer, 请求处理类 ...
随机推荐
- [心跳] 使用心跳机制实现CS架构下多客户端的在线状态实时更新以及掉线自动重连
此文讲述的内容是一个实际项目开发中的一部分内容,笔者将亲身经历写成文章. [背景] 现 需要实现这样的功能:有多个客户端连着同一个服务器.服务器和客户端之间需要“互相”知道彼此的连接状态.比如在某一时 ...
- dubbo入门之helloWorld
dubbo官方文档:http://dubbo.apache.org/zh-cn/docs/user/quick-start.html 基于spring coloud的demo:http://start ...
- zookeeper 安装的三种模式
Zookeeper安装 zookeeper的安装分为三种模式:单机模式.集群模式和伪集群模式. 单机模式 首先,从Apache官网下载一个Zookeeper稳定版本,本次教程采用的是zookeeper ...
- PHP生成页面二维码解决办法?详解
随着科技的进步,二维码应用领域越来越广泛,今天我给大家分享下如何使用PHP生成二维码,以及如何生成中间带LOGO图像的二维码. 具体工具: phpqrcode.php内库:这个文件可以到网上下载,如果 ...
- DevOps工具链
Devops工具链 DevOps实际是一种文化上的变迁,代表了开发.运维.测试等环节之间的协作,因此DevOps工具是非常多种多样的,甚至可以由多种工具组成一个完整的DevOps工具链.此类工具可以应 ...
- vue报错/ style-loader: Adds some css to the DOM by adding a <style> tag
1.1.1. vue-cli搭建的项目引入.styl/css文件报错 http://blog.csdn.net/z852064121/article/details/72660327 / styl ...
- poj-1989 The Cow Lineup
The Cow Lineup Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5587 Accepted: 3311 Descri ...
- Python面向对象:获取对象信息
学习笔记内容简介: 获取对象属性和方法的函数: type(): 判断对象类型 isinstance() : 判断class的类型 dir() : 获得一个对象的所有属性和方法 把属性和方法列出来是不够 ...
- 网站优化不等于搜索引擎优化SEO
对于SEO相信搞网络营销的人基本上都知道这个名词,英文全称为search engine optimization,中文一般叫搜索引擎优化,也有的叫搜索引擎定位(Search Engine Positi ...
- 【python-opencv】22-直方图
直方图目录: 22.1 直方图的计算,绘制与分析 22.1.1 统计直方图 22.1.2 绘制直方图 22.1.3 使用掩膜(遮罩) 22.2 直方图均衡化 22.2.1 OpenCV中的直方图均衡化 ...