Python入门基础之socket多线程编程,TCP服务器和客户端通信

在上一篇文章中,我介绍了一下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编程

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180329A1TEV500?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券