python socketserver

socketserver是基于socket写成的一个更强大的模块。

socketserver简化了网络服务器的编写。它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer。这4个类是同步进行处理的,另外通过ForkingMixIn和ThreadingMixIn类来支持异步。

在python3中该模块是socketserver,在python2中该模块是Socketserver

1
2
3
4
5
分情况导入导入模块
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端,多线程方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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端

1
2
3
4
5
6
7
8
9
10
11
12
13
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端

1
2
3
4
5
6
7
8
9
10
11
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端

1
2
3
4
5
6
7
8
9
10
11
12
13
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是基于socket写成的一个更强大的模块。

socketserver简化了网络服务器的编写。它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer。这4个类是同步进行处理的,另外通过ForkingMixIn和ThreadingMixIn类来支持异步。

在python3中该模块是socketserver,在python2中该模块是Socketserver

1
2
3
4
5
分情况导入导入模块
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端,多线程方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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端

1
2
3
4
5
6
7
8
9
10
11
12
13
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端

1
2
3
4
5
6
7
8
9
10
11
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端

1
2
3
4
5
6
7
8
9
10
11
12
13
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" ))

  

猜你喜欢

转载自www.cnblogs.com/bubu99/p/10171630.html