socketserver模块
SocketServer是标准库的一个高级模块,在Python3.x改名为socketserver,用于创建网络客户端和服务端。当使用这个模块的时候,它是以面向对象的方式处理事务,有利于组织数据,以及逻辑性的将功能放在正确的位置,你还会注意到,应用程序现在是事件驱动的,这意味着只有系统有事件发生的时,他们才会工作。
在原始服务器循环中,我们阻塞等待请求,当接收到请求时,就对其提供服务,然后继续等待,在此处的服务器循环中,并非在服务器中创建代码,而是定义一个处理程序,这样当一个服务器收到一个传入请求的时候,服务器就可以调用你的程序。
SocketServer模块类
类 | 描述 |
---|---|
BaseServer | 包含核心服务器功能和mix-in类的钩子,仅用于推导,这样不会创建这个类的实例;可以用TCPServer或UDPServer创建类的实例 |
TCPServer/UDPServer | 基础的网络同步TCP/UDP服务器 |
UnixStreamServer/UnixDatagramServer | 基于文件的基础同步TCP/UDP服务器 |
ForkingMixIn/ThreadingMixIn | 核心派出或线程功能;只用作mix-in类与一个服务器类配合实现一些异步性:不能直接实例化这个类 |
ForkingTCPServer/ForkingUDPServer | ForkingMixIn和TCPServer/UDPServer的组合 |
ThreadingTCPServer/ThreadingUDPServer | ThreadingMixIn和TCPServer/UDPServer的组合 |
BaseRequestHandler | 包含处理服务请求的核心功能;仅仅用于推导,这样无法创建这个类的实例;可以使用StreamRequestHandler或DatagramRequestHandler创建类的实例 |
StreamRequestHandler/DatagramRequestHandler | 实现TCP/UDP服务器的服务处理器 |
TCP服务端
程序是《python核心编程》的例程,但是测试例程出了一点问题,这里做了修改贴上来记录一下。
时间戳TCP服务器,客户端发送信息,服务端接受信息打上时间戳并返回。
[root@localhost ~]# cat Tcp_SS_Ser.py
#!/usr/bin/env python3.4
from socketserver import (TCPServer as TCP,
StreamRequestHandler as SRH)
from time import ctime
HOST = ''
PORT = 21567
ADDR = (HOST, PORT)
class MyRequestHandler(SRH):
def handle(self):
print('...connected from:', self.client_address)
self.wfile.write(('[%s] %s' %(ctime(), self.rfile.readline().decode())).encode())
tcpServ = TCP(ADDR, MyRequestHandler)
print('waiting for connection...')
tcpServ.serve_forever()
TCP客户端
[root@localhost ~]# cat Tcp_SS_Cli.py
#!/usr/bin/env python3.4
from socket import *
HOST = 'localhost'
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT)
while True:
tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
data = input('> ')
if not data:
break
tcpCliSock.send(('%s\r\n' % data).encode())
data = tcpCliSock.recv(BUFSIZE).decode()
if not data:
break
print(data.strip())
tcpCliSock.close()
期间遇到的错误
[root@localhost ~]# ./tcp_SS.py
Traceback (most recent call last):
File "./tcp_SS.py", line 3, in <module>
from SocketServer import (TCPServer as TCP,
ImportError: No module named 'SocketServer'
原因:SocketServer模块是python2的名称,在python已经改成socketserver了,所以吧名称改一下就可以了
from socketserver import (TCPServer as TCP,
StreamRequestHandler as SRH)