Python之socketserver模块使用方法

socketserver是Python中一个高级类,用于简化实现网络客户端与服务器所必须的大量样板代码,比如listen()、accept()啊,并且还支持了异步处理,达到简化网络服务器编写的目的。python-socket

0x00 关于socketserver模块

socketserver模块在Python2.x中就有了,不过其模块名字为SocketServer,不知道为什么到了Python3.x的时候变为了小写。不过使用方法基本还是一致的。

在socketserver模块中,他包含4个主要的同步处理的类(server class):TCPServer、UDPServer、UnixStreamServer和UnixDatagramServer;还有2个用于异步处理的类:ForkingMixIn和TreadingMixIn。

+------------+
| BaseServer |
+------------+
      |
      v
+-----------+        +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+        +------------------+
      |
      v
+-----------+        +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+        +--------------------+

在socketserver中有2种类,一种是服务器类(上面的及种类)及请求处理类(request handle class),服务类主要提供了类似于绑定、监听及接受请求的工作;而请求处理类,完成了链接后的一些用户所发送数据的处理的事物逻辑。

如何创建socketserver

1.首先创造一个请求处理类(request handle class)让其继承与BaseRequestHandler类,并重写handle()方法,这个方法将用来处理链接后的客户端的请求,处理事物逻辑。

2.之后需要实例化一个服务器类(server class),入TCPServer,并传入服务器的地址(IP与端口)及请求处理类(就是第一步创建的类)。

3.之后服务器对象调用handle_request()或者serve_forever方法来完成一次或永远执行。

4.最后可以使用serve_close()方法来关闭套接字socket。

0x01 socketserver代码实例

服务器端的代码按照上面的规则去编写,而客户端的规则几乎和原来一模一样。

服务器端(同步通信)

import socketserver

class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        while True:
            content = self.request.recv(1024)
            print(content.decode('utf-8'))
            self.request.send(bytes(content.decode('utf-8').upper(),'utf-8'))

server = socketserver.TCPServer(('127.0.0.1',8090),MyServer)
server.serve_forever()

客户端

import socket

sk = socket.socket()
sk.connect(('127.0.0.1',8090))

while True:
    content = input('>>>').encode('utf-8')
    sk.send(content)
    msg = sk.recv(1024)
    print(msg.decode('utf-8'))

之后就可以完成与服务器端的通信了,由于TCPServer只是支援同步的通信,当两个Client链接上时候,后面链接的Client就会发生阻塞现象,那么可以使用异步通信。

服务器端(异步通信)

import socketserver

class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        while True:
            content = self.request.recv(1024)
            print(content.decode('utf-8'))
            self.request.send(bytes(content.decode('utf-8').upper(),'utf-8'))

#使用ThreandingTCPServer
server = socketserver.ThreadingTCPServer(('127.0.0.1',8090),MyServer)
server.serve_forever()

这样就可以完成多用户的请求处理了

0x02 参考文献

#socketserver API

https://docs.python.org/3/library/socketserver.html

https://yiyibooks.cn/xx/python_352/library/socketserver.html

发表评论