SocketServer
socketserver是基于socket写成的一个更强大的模块。
socketserver简化了网络服务器的编写。它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer。这4个类是同步进行处理的,另外通过ForkingMixIn和ThreadingMixIn类来支持异步。
在python3中该模块是socketserver,在python2中该模块是Socketserver
分情况导入导入模块
try:
import socketserver #Python 3
except ImportError:
import SocketServer #Python 2
服务器
服务器要使用处理程序,必须将其出入到服务器对象,定义了5个基本的服务器类型(就是“类”)。
BaseServer,TCPServer,UnixStreamServer,UDPServer,UnixDatagramServer。 注意:BaseServer不直接对外服务。关系如下

服务器:
要使用处理程序,必须将其传入到服务器的对象,定义了四个基本的服务器类
(1)TCPServer(address,handler) 支持使用IPv4的TCP协议的服务器,address是一个(host,port)元组。Handler是BaseRequestHandler或StreamRequestHandler类的子类的实例。
(2)UDPServer(address,handler) 支持使用IPv4的UDP协议的服务器,address和handler与TCPServer中类似。
(3)UnixStreamServer(address,handler) 使用UNIX域套接字实现面向数据流协议的服务器,继承自TCPServer。
(4)UnixDatagramServer(address,handler) 使用UNIX域套接字实现数据报协议的服务器,继承自UDPServer。
这四个类的实例都有以下方法。
1、s.socket 用于传入请求的套接字对象。
2、s.sever_address 监听服务器的地址。如元组("127.0.0.1",80)
3、s.RequestHandlerClass 传递给服务器构造函数并由用户提供的请求处理程序类。
4、s.serve_forever() 处理无限的请求 #无限处理client连接请求
5、s.shutdown() 停止serve_forever()循环
SocketServer模块中主要的有一下几个类
1、BaseServer 包含服务器的核心功能与混合类(mix-in)的钩子功能。这个类主要用于派生,不要直接生成这个类的类对象,可以考虑使用TCPServer和UDPServer类。
2、TCPServer 基本的网络同步TCP服务器
3、UDPServer 基本的网络同步UDP服务器
4、ForkingTCPServer 是ForkingMixIn与TCPServer的组合
5、ForkingUDPServer 是ForkingMixIn与UDPServer的组合
6、ThreadingUDPServer 是ThreadingMixIn和UDPserver的组合
7、ThreadingTCPServer 是ThreadingMixIn和TCPserver的组合
8、BaseRequestHandler 必须创建一个请求处理类,它是BaseRequestHandler的子类并重载其handle()方法。
9、StreamRequestHandler 实现TCP请求处理类的
10、DatagramRequestHandler 实现UDP请求处理类的
11、ThreadingMixIn 实现了核心的线程化功能,用于与服务器类进行混合(mix-in),以提供一些异步特性。不要直接生成这个类的对象。
12、ForkingMixIn 实现了核心的进程化功能,用于与服务器类进行混合(mix-in),以提供一些异步特性。不要直接生成这个类的对象。
关系图如下:


创建服务器的步骤
1:首先必须创建一个请求处理类
2:它是BaseRequestHandler的子类
3:该请求处理类是BaseRequestHandler的子类并重新写其handle()方法
实例化 请求处理类传入服务器地址和请求处理程序类
最后实例化调用serve_forever() #无限处理client请求
简单实例tcp方式
服务器server端,多线程方式
import socketserver class Myserver(socketserver.BaseRequestHandler): #基本的通信循环
def handle(self):
print("连接:》》",self.request) #与client的链接请求信息
print("addr :>>",self.client_address) #获取client的地址和端口号
while True:
try:
data = self.request.recv(1024)
if not data:break
print("收到client消息是:>>",data.decode("utf-8"),self.client_address)
back_data = input(":>>")
self.request.sendall(back_data.encode("utf-8")) except Exception:
break
if __name__ == '__main__':
s=socketserver.ThreadingTCPServer(("127.0.0.1",8000),Myserver) #开启多线程,绑定地址,和处理通信的类
print("\033[1;33mstart\033[0m".center(50,"#"))
s.serve_forever()#连接循环
client端
from socket import *
ip_port = ("127.0.0.1",8000)
buffersize = 1024
tcp_client = socket(AF_INET,SOCK_STREAM)
tcp_client.connect(ip_port) while True: msg = input(":>>>>")
if not msg:continue
tcp_client.send(msg.encode("utf-8"))
data = tcp_client.recv(buffersize)
print("客户端收到的消息是",data.decode("utf-8"))
1.开启程序

2.client连接

3.开始通信

简单示例udp方式:
程序server端
import socketserver class Myserver(socketserver.BaseRequestHandler):
def handle(self):
print(self.request)
print("收到客户端的消息是:》",self.request[0])
self.request[1].sendto(self.request[0].upper(),self.client_address)
if __name__ == '__main__':
s = socketserver.ThreadingUDPServer(("127.0.0.1",8000),Myserver)
print("\033[1;33mstart\033[0m".center(50, "#"))
s.serve_forever()
client端
from socket import *
ip_port = ("127.0.0.1",8000)
buffersize = 1024
udp_client = socket(AF_INET,SOCK_DGRAM)
udp_client.connect(ip_port) while True: msg = input(":>>>>")
if not msg:continue
udp_client.sendto(msg.encode("utf-8"),ip_port)
data,addr = udp_client.recvfrom(buffersize)
print("客户端收到的消息是",data.decode("utf-8"))
SocketServer的更多相关文章
- Python(七)Socket编程、IO多路复用、SocketServer
本章内容: Socket IO多路复用(select) SocketServer 模块(ThreadingTCPServer源码剖析) Socket socket通常也称作"套接字" ...
- 开发socketserver 以及定制开发自己的FTP服务器
socket server 示例 #服务端程序 import socketserver class TcpHandler(socketserver.BaseRequestHandler): def h ...
- socket - socketserver - start TCP server
前面提到如何使用socket模块启动tcpserver: 创建socket:sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 绑定ip: ...
- socketserver 分块记录
网络编程 Socket(TCP,IP)套接字 服务端 运行起来, 客户端 客户端 客户端 客户端 服务端: import socket sk = socket.socket() #绑定端口号 sk.b ...
- socketserver服务器
''' 网络编程 Socket(TCP,IP)套接字 服务端 运行起来, 客户端 客户端 客户端 客户端 服务端: import socket sk = socket.socket() #绑定端口号 ...
- Python基础篇【第8篇】: Socket编程(二)SocketServer
SocketServer 在上一篇文章中我们学习了利用socket模块创建socket通信服务,但细心学习后就会发现利用socket模块创建的服务无法进行多进程的处理,当需要进行大量请求处理时,请求就 ...
- 自己实现多线程的socket,socketserver源码剖析
1,IO多路复用 三种多路复用的机制:select.poll.epoll 用的多的两个:select和epoll 简单的说就是:1,select和poll所有平台都支持,epoll只有linux支持2 ...
- Socket与SocketServer结合多线程实现多客户端与服务器通信
需求说明:实现多客户端用户登录,实现多客户端登录一般都需要使用线程技术: (1)创建服务器端线程类,run()方法中实现对一个请求的响应处理: (2)修改服务器端代码,实现循环监听状态: (3)服务器 ...
- socketserver模块写的一个简单ftp程序
一坨需求... 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp server上随意切换目录 (cd) ...
随机推荐
- 嵌入式:J-link刷固件(坑)
1.上电,短接ERASE,>10秒后,拔USB. 2.短接TST,上电,>10秒后,拔USB. 3.安装驱动.(看别人教程,下载到INF文件,WIN7不能右击安装,好,换虚拟机XP) 4. ...
- MYSQL离线安装
由于MySQL的广泛应用,MySQL的安装也就成了大家经常会碰到的问题.并且由于不是所有机器都可连接外网,所以MySQL的离线安装显得比较重要.而本文旨在介绍CentOS6.6下离线安装MySQL. ...
- IO流的登录与注册
import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileR ...
- win7 64位下vs不能以管理员身份运行的问题解决
开发机上安装了VS6.0/2008/2010/2013,之前一直是正常的,突然莫名其妙不能以管理员身份运行(除了VS6),报"application cannot start.", ...
- [Erlang 0110] Erlang Abstract Format , Part 1
Erlang Abstract Format并不难懂,只是枯燥一点罢了,如果把Abstract Format的文档翻译出来,其实就是Erlang教科书中语法入门的部分. Erlang Abstract ...
- PHP相关笔记
扩展包(相关链接):https://packagist.org/: 插件postman主要应用于web开发时get.post请求时查看其响应:
- JAVA NIO Scatter/Gather(矢量IO)
矢量IO=Scatter/Gather: 在多个缓冲区上实现一个简单的IO操作.减少或避免了缓冲区拷贝和系统调用(IO) write:Gather 数据从几个缓冲区顺序抽取并沿着通道发送,就好 ...
- 《Note --- Unreal 4 --- PersonaHowToMovement》
https://docs.unrealengine.com/latest/CHN/Gameplay/HowTo/CharacterMovement/index.html 这里的demo是按照一些per ...
- 属性类:Properties
属性是程序中经常出现的形式. 在类集中提供了一种专门的Properties类. public class Propertiesextends Hashtable<Object,Object> ...
- servlet过滤器使用
servlet的过滤器夹在用户和servlet之间,可以截获并预处理或者打断{用户到servlet的请求或servlet到用户的响应},但本身并不能处理和响应用户请求. filter类必须实现Filt ...