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) ...
随机推荐
- java web之个人通讯录系统
前天下了第一场雪,专业课老师给我们布置了一个期末小作业,真的感觉到寒假就要来临了.这个学期没过多久就要结束了.总结这学期,感觉还是有不少收获的.完成了当初许下的诺言,现在也越来越喜欢软件这个行业了,虽 ...
- Swift-常量变量
OC 用NSLog输出日志 swift 用print输出日志 swift语句结束不需要加:号 常量和变量: OC 定义常量 const int a = 10; swift 定义常量 let a = 1 ...
- 最快让你上手ReactiveCocoa之基础篇
前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCocoa,但是感觉真正缺少的是一篇如何学习ReactiveCocoa的文章,这里介绍一下. 1.Rea ...
- 在项目中使用ExtJS
主要目录文件介绍 builds:压缩后的ExtJS代码,体积更小,更快:docs:开发文档:examples:官方演示示例:locale:多国语言资源文件:pkgs:ExtJS各部分功能的打包文件:r ...
- 处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandler”
新服务器安装完开发环境后,还需要注册framework4.0到IIS.不然会报错: HTTP 错误 500.21 - Internal Server Error 处理程序“Extensionles ...
- JAVA编程思想(第四版)学习笔记----11.4 容器的打印
import static java.lang.System.out; import java.util.ArrayList; import java.util.Collection; import ...
- mysql 5.6.24安装实例
安装前准备工作: 1)编辑PATH路径 vim /etc/profile PATH=/home/mysql/bin:/home/mysql/lib:$PATH export PATH 2)生效PATH ...
- 如何在mac上用终端打开XAMPP自带的MySQL
注:1.本文未经博主同意,不得转载! 2.所有终端语句都分行显示,以免大家看错: 直接开始,过程中对每一步可能出现的错误都进行了说明. 1.安装好xampp,然后打开终端,输入: mysql -u r ...
- 如何利用报表工具FineReport实现报表列的动态展示
相信动态列的实现困扰了很多人,大数据量,多字段的加载将会非常耗时,数据又做不到真正的动态灵活.现有的方式都是通过变向的隐藏等方式来实现. 那该如何解决呢?这里分享帆软报表设计器FineReport的实 ...
- Linux 进程与线程五
pthread_self函数 pthread_t pthread_self(void); 一般会成功,返回当前线程的ID 注意:在子线程中执行exit()函数会退出整个进程,一般使用pthread_e ...