利用select实现伪并发的socket博文中我们说了:

如果要实现一个server端可以和多个客户端进行通信可以使用

1.多线程

2.多进程

3.select I/O多路复用

在那篇博文中我们介绍了使用select模块实现单线程的伪并发的程序间的通信,那今天我们就来谈一谈如何使用多线程来实现并发.

 

Pyhton本身就提供了一个基于多线程实现并发socket的模块---->SocketServer模块。那么今天我们就来探讨一下SocketSever模块.

 SocetServer模块实现并发的原理就是:每有一个客户端连接进来,就会起一个线程负责和这个客户端进行通信。

SocketServer模块

使用SocketServer模块的时候必须在自定义的类中定义一个handle(方法名必须是handle,差一个字母都不行)方法,在handle方法中去定义具体的操作。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import SocketServer

class MyServer(SocketServer.BaseRequestHandler):
    def handle(self):
        conn = self.request #如果连接请求过来,获取client端对象
        conn.sendall('欢迎致电 10086,请输入1xxx,0转人工服务.') #发送一个信息
        Flag = True #并把Flag设置为True
        while Flag:#当Flag为True的时候执行
            data = conn.recv(1024) #接收client端数据
            if data == 'exit': #判断如果data  == 'exit' 退出
                Flag = False #并把Flag设置为Flase
            elif data == '0': #如果为 == ‘0’
                conn.sendall('通过可能会被录音.balabala一大推') #发送数据
            else:#上面的都没匹配上,发送请重新输入
                conn.sendall('请重新输入.')


if __name__ == '__main__':
    server = SocketServer.ThreadingTCPServer(('127.0.0.1',8009),MyServer) #实例化对象,设置启动的IP/PORT并把自己定义的类写上作为SocketServer.ThreadingTCPServer的构造函数
    server.serve_forever() #调用对象中的启动方法
server

相关文章: