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) ...
随机推荐
- Atitit ftp原理与解决方案
Atitit ftp原理与解决方案 Deodeo sh shmayama ..search ftp.. 1. http和ftp都只是通信协议,就是只管传输那一块的,那为什么不能使用ftp来显示网页?? ...
- android Base64 加密
一 Base64加密 import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStre ...
- 一款MVC5+EF+Bootstrap搭建的后台通用管理系统模板
最近闲来无事,就用MVC5+EF+Bootstrap搭建了一个通用的后台管理系统的模板,里面使用到的技术包括: MVC,EF,T4模板批量生成 Jquery,jqGrid Bootstrap DDD ...
- 高级数据过滤(like)
单字符过滤 '_' select * from T_Employee where FName like '_erry' 多字符过滤 '%' select * from T_Employee wher ...
- Linux 系统中的MySQL数据库默认区分大小写
今天在开发中遇到这么个问题,将连接的数据库改为服务器上的时候(服务器是Linux系统的),程序跑起来后一直出错,总提示数据库的表找不到, 而打开数据库看该表明明是存在的,在我的印象中MySQL数据是不 ...
- Linux下ps命令详解 Linux下ps命令的详细使用方法
http://www.jb51.net/LINUXjishu/56578.html Linux下的ps命令比较常用 Linux下ps命令详解Linux上进程有5种状态:1. 运行(正在运行或在运行队列 ...
- Windows Server 2008 R2 NTP服务器
Server 1.查看服务器信息 w32tm /query /status 2.设置同步地址 w32tm /config /manualpeerlist:time.windows.com /syncf ...
- Android 更改 Toast 的默认位置
Android中Toast的默认位置在屏幕靠近底部的位置,这个默认位置有时候并不合适.比如页面上内容较少时,内容一般集中在屏幕上半部分,用户的注意力也集中在屏幕上半部分,默认位置的Toast用户可能没 ...
- (转)浅谈Java中的对象和对象引用
原文地址: http://www.cnblogs.com/dolphin0520/p/3592498.html 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很 ...
- C++点滴----关于类常成员函数
关于C++中,类的常成员函数 声明样式为: 返回类型 <类标识符::>函数名称(参数表) const 一些说明: 1.const是函数声明的一部分,在函数的实现部分也需要加上const ...