Socketserver
Socketserver:
基于tcp的套接字,关键就是两个循环,一个链接循环,一个通信循环
socketserver模块中分两大类:server类(解决链接问题)和 request类(解决通信问题)
基于tcp 的socketserver我们自己定义的类中的 self.server即套接字对象 self.request即一个链接 self.client_address即客户端地址 基于udp 的socketserver我们自己定义的类中的 self.request是一个元组(第一个元素是客户端发来的数据,第二部分是服务端的udp套接字对象),如(b'adsf', <socket.socket fd=200, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8080)>) self.client_address即客户端地址
线程实现:
进程实现:
socketserver —— 实现ftp server端和client端的交互
import socketserver class MyServer(socketserver.BaseRequestHandler): def 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) server.serve_forever()
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': break sk.close()