在上一篇文章中,我介绍了一下python3 socket编程的基础,包括TCP、UDP客户端和服务器的建立过程(链接在最下方)。不过那个只是单线程的,服务器一次只能和一个客户端会话,多个客户端的话只能等待。我们平时的应用中,服务器肯定是要并发的,所以,今天将介绍socket编程的多线程编程。一个服务器同时和多个客户端建立会话。
多线程原理:TCP服务器会创建一个线程池,每当有客户端请求连接的时候,它便会从线程池中分配一个线程同客户端建立连接,当客户端中断连接后,线程便销毁。
SocketServer 模块
在python中,socket多线程并发的实现主要是利用SocketServer模块实现的。客户端比较简单,一般只用socket就可以,服务器端复杂些,用socketserver或者Twisted 框架等,本篇主要讲SocketServer。
SocketServer 是标准库中一个高级别的模块。用于简化网络客户与服务器的实现。
socketserver模块中分两大类:server类(解决链接问题)和request类(解决通信问题)
server类:
Request类:
类的描述如下:
SocketServerTCP服务器:
这里我们用到了类,因为多线程就可以利用面向对象了,每一次连接,不过是实现了一个实例。类我前面也讲过了有兴趣可以看一下。
在代码中,先导入我们的服务器类,然后像之前一样定义主机常量。主机常量后就是我们的请求处理器类,然后是启动代码。
服务器和客户端建立连接的步骤我就不写了,上一篇文章中有
不废话了,上代码:
服务器端:
代码解释:
我们从 SocketServer 的 StreamRequestHandler 类中派生出一个子类,并重写 handle()函数。
在有客户消息进来的时候,handle()函数就会被调用。StreamRequestHandler 类支持像操作文件对象那样操作输入输出套接字。用request.recv()函数接收消息。因为socketserver是封装好的模块,我们不需要对其初始化连接。
其中self.request self.client_address等于socket中 conn,addr = socket.accept(),只不过在socketserver模块中已经替我们包装好了,还替我们包装了包括bind()、listen()、accept()方法(不懂得看我前面文章,连接在下面)。
代码中间部分就是接收客户端消息,并返回给客户端。
代码的最后部分用给定的主机信息和请求处理类创建 TCP 服务器。然后进入等待客户请求与处理客户请求的无限循环中。
客户端:
客户端非常简单,就是简单socket编程。代码和上一篇中的都一样,就是多了一个异常处理。
步骤就是昨天我发的文章里面的
码字不易,多多关注。
上一篇:Python入门基础之网络编程-socket编程、TCP、UDP编程
领取专属 10元无门槛券
私享最新 技术干货