socketserver
之前讲道德socket模块是单进程的,只能接受一个客户端的连接和请求,只有当该客户端断开的之后才能再接受来自其他客户端的连接和请求。当然我们也可以通过python的多线程等模块自己写一个可以同时接收多个客户端连接和请求的socket。但是这完全没有必要,因为python标准库已经为我们内置了一个多线程的socket模块socketserver,我们直接调用就可以了,完全没有必要重复造轮子。
我们只需简单改造一下之前的socket演示程序的服务端就可以了,客户端不用变
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#!/usr/bin/env python3 # coding:utf-8 ''' Created on: 2016年3月5日 @author: 张晓宇 Email: 61411916@qq.com Version: 1.0 Description: socketserver演示程序 Help: ''' import socketserver class Myserver(socketserver.BaseRequestHandler): ''' 定义一个类,这个类要继承自socketserver.BaseRequestHandler ''' def handle( self ): ''' 重写handle方法,这个非常关键,当server收到客户端的请求,就会为更改客户端单独 启动一个线程并调用该方法处理客户端的请求 ''' print ( 'New Conn: ' , self .client_address) while True : ''' 循环接收客户端发送过来的数据,这里可以一 些判断比如接收到的内容为空或发生异常及其 他推出逻辑来退出循环 ''' data = self .request.recv( 1024 ) print ( 'Client say: %s' % data.decode()) self .request.send(data) if __name__ = = '__main__' : IP_PORT = ( '127.0.0.1' , 9999 ) # 定义监听的IP地址和端口 server = socketserver.ThreadingTCPServer(IP_PORT, Myserver) # 创建soeketserver对象,ThreadingTCPServer方法接收两个参数,一个是监听的ip地址和端口,另一个是刚才我们创建的类 server.serve_forever() # 启动服务 |
看,是不是很简洁,其实socketserver就是用了多线程和类的技术对原生socket模块做了封装,我们使用起来就是这么简单