《python核心编程》读书笔记-socketserver模块

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)

猜你喜欢

转载自blog.csdn.net/L835311324/article/details/86220130
今日推荐