一、socketserver模块
1、作用:用来实现并发编程
2、py2和py3的区别:py3是socketserver py2是SocketServer
3、和socket模块还有multiprocessing模块的区别:
》》》和socket模块:socket在py2中是只能实现串行编程,不能实现并发,只能等一个客户端执行完后才能执行下一个客户端;在py3中单纯的使用socket模块也可以多个客户端同时访问服务端,但也是只能一个客户端执行完后再执行下一个客户端,但是我们通常还是用socketserver模块
》》》和multiprocessing模块:若用socket模块和创建子进程模块(multiprocessing),其实是启用了server的多个子进程,实际上是启用了多个server,是对电脑资源的浪费;而socketserver模块就是实现并发编程的,只有一个server,多个客户端可以同时访问。
补充:对于socket模块,py3中send必须用字节类型,但在py2中可以用字符串类型发送
》》》》》举例
服务端
import socketserverclass MyServer(socketserver.BaseRequestHandler): #固定 必须定义一个类且和下面的名字一样,必须继承 def handle(self): #固定 必须写handle函数 当客户端的连接请求过来时就拿到了self,就被实例化 conn = self.request #固定,就拿到了服务端的连接 conn.sendall(bytes('欢迎致电 10086,请输入1xxx,0转人工服务.',encoding='utf-8')) Flag = True while Flag: data = conn.recv(1024).decode('utf-8') if data == 'exit': Flag = False elif data == '0': conn.sendall(bytes('通过可能会被录音.balabala一大推',encoding='utf-8')) else: conn.sendall(bytes('请重新输入.',encoding='utf-8'))if __name__ == '__main__': #固定 server = socketserver.ThreadingTCPServer(('127.0.0.1',8008),MyServer) #固定,仍然是服务端的IP和端口号,类的名字可以自己取,但必须 和定义的一样 server.serve_forever() #固定 这两句话就自动执行handle函数
客户端
import socket #客户端没有区别ip_port = ('127.0.0.1',8008)sk = socket.socket()sk.connect(ip_port)sk.settimeout(5)while True: data = sk.recv(1024).decode('utf-8') print('receive:',data) inp = input('please input:') sk.sendall(bytes(inp,encoding='utf-8')) if inp == 'exit': breaksk.close()