SocketServer模块
内部使用 IO 多路复用以及'多线程'和'多进程',从而实现并发处理多个客户端请求的 socket 服务端.讲人话就是:每个客户端请求连接到服务器时, socket 服务端都在会服务器中创建一个线程或者进程,来专门处理当前客户端的所有请求.
其实这个模块就是基于 tcp 的套接字,关键就是两个循环.一个链接循环,一个通讯循环
socketserver 模块中分为两大类:
- server(服务) 类是为了解决链接问题而存在
- request(请求) 类是为了解决通信问题存在
分析一波 socketserver 源码
太多...略......
直接看总结???
基于 tcp 的 socketserver 我们自己定义的类中
- self.server 就是套接字对象
- self.request 就是一个链接
- self.client_addr 就是客户端地址
最基础版本:
这是服务端, 客户端没写 把之前的直接拿过来就可以了.# import socketserver## class MYTCPServer(socketserver.BaseRequestHandler):# def handle(self):# # print(self.request)# # print(self.client_address)## while True :# try :# data = self.request.recv(1024) #self.request 就相当于 conn 了# if not data: break# self.request.send(data.upper())# except Exception:# break## self.request.close()## server = socketserver.ThreadingTCPServer(('127.0.0.1',6666),MYTCPServer)## server.allow_reuse_address = True# server.serve_forever()还是把客户端写了吧.#客户端from socket import *client = socket(AF_INET,SOCK_STREAM)client.connect(('127.0.0.1',6666))#循环while True; msg = input('>> :').strip() if not msg: continue client.send(msg.encode('utf-8')) data = client.recv(1024) print(data.decode('utf-8'))
ThreadingTCPServer:
使用 ThreadingTCPServer:
- 创建一个继承自 ScoketServer.BaseRequestHandler的类
- 类中必须定义一个 handle 的方法
- 启动 ThreadingTCPServer
ForkingTCPServer:
ForkingTCPServer和 ThreadingTCPServer 的使用和执行流程基本一样, 区别:在内部分别为请求者建立 一个是线程,一个是进程.
就是把上面代码里的 server = socketserver.ThreadingTCPServer(('127.0.0.1',6666),MYTCPServer) 变为server = socketserver.ForkingTCPServer(('127.0.0.1',6666),MYTCPServer)