建一个SocketServerTCP服务器
在代码中,先导入我们的服务器类,然后像之前一样定义主机常量。主机常量后就是我们的请求处理器类,然后是启动代码。在下面的代码片段中可以看到更多细节。
逐行解释
1~9行
最开始的部分是从SocketServer导入需要的类。注意,我们在使用Python
2.4的多行导入的方式。如果你使用老版本的Python,那么你要使用模块的形如module.attribute的名字。或者在导入的时候,把代码写在同一行里:
from SocketServer import TCPServer as TCP, StreamRequestHandler as SRH
例16.5 SocketServer时间戳TCP服务器(TsTservss.py)
使用SocketServer里的TCPServer和StreamRequestHandler类创建一个时间戳TCP服务器。
1 #!/usr/bin/env python
2
3 from SocketServer import (TCPServer as TCP,
4 StreamRequestHandler as SRH)
5 from time import ctime
6
7 HOST = ''
8 PORT = 21567
9 ADDR = (HOST, PORT)
10
11 class MyRequestHandler(SRH):
12 def handle(self):
13 print '...connected from:', self.client_address
14 self.wfile.write('[%s] %s' % (ctime(),
15 self.rfile.readline()))
16
17 tcpServ = TCP(ADDR, MyRequestHandler)
18 print 'waiting for connection...'
19 tcpServ.serve_forever()
11~15行
主要的工作在这里。我们从SocketServer的StreamRequestHandler类中派生出一个子类,并重写handle()函数。在BaseRequest类中,这个函数因没有默认动作而被中断:
def handle(self):
pass
在有客户消息进来的时候,handle()函数就会被调用。StreamRequestHandler类支持像操作文件对象那样操作输入输出套接字。我们可以用readline()函数得到客户消息,用write()函数把字符串发给客户端。
为了保持一致性,我们要在客户端与服务器两端的代码里都加上回车与换行。实际上,你在代码中看不到这个,因为,我们重用了客户端传过来的回车与换行。除了这些我们刚刚说到的不同之处外,代码看上去与之前的那个服务器是一样的。
17~19行
代码的最后部分用给定的主机信息和请求处理类创建TCP服务器。然后进入等待客户端请求与处理客户请求的无限循环中。