编写一个异步Python套接字服务器程序。服务器处理客户端发出的请求时不能阻塞,因此要找到一种机制来单独处理每个客户端。
SocketServer模块提供了可以直接使用的TCP、UDP及其他协议服务器。可以创建ForkingServer类,继承TCPServer和ForkingMixIn类。前一个父类让ForkingServer类实现了之前手动完成的所有服务器操作,例如创建套接字、绑定地址和监听进入的连接。我们的服务器还要继承ForkingMixIn类,异步处理客户端。
ForkingServer类还要创建一个请求处理程序,说明如何处理客户端请求,服务器会回显客户端发送的文本字符串。请求处理类ForkingServerRequestHandler继承自SocketServer库提供的BaseRequestHandler类。
回显服务器的客户端ForkingClient可以使用面向对象的方式编写。在Python中,类的构造方法叫作__init__()。按照惯例,要把self作为参数传入__init__()方法,以便指定具体实例的属性。ForkingClient连接的回显服务器要在__init__()方法中初始化,然后在run()方法中向服务器发送消息。
若想测试ForkingServer类,可以启动多个回显客户端,看看服务器如何响应客户端。
import os
import socket
import threading
import SocketServer
SERVER_HOST = 'localhost'
SERVER_PORT = 0 # tells the kernel to pick up a port dynamically
BUF_SIZE = 1024
ECHO_MSG = 'Hello echo server!'
class ForkingClient():
def __init__(self, ip, port):
self.sock = socket.socket(socket.AF_INET, socket