socketServer并发处理socket

时间:2021-10-13 23:57:38

socketserver简单介绍 

'''
socketserver:是对socket的封装,实现并发处理
前两个TCP,UDP常用,后两个不常用
'''
import socketserver

socketserver.TCPServer(server_address="",RequestHandlerClass="",bind_and_activate=True)  # TCP协议
socketserver.UDPServer(server_address="",RequestHandlerClass="",bind_and_activate=True)  # UDP协议
socketserver.UnixStreamServer(server_address="",RequestHandlerClass="",bind_and_activate=True) # unix下tcp
socketserver.UnixDatagramServer(server_address="",RequestHandlerClass="",bind_and_activate=True) # unix下udp

'''
+------------+
| BaseServer |
+------------+
      |
      v
+-----------+        +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+        +------------------+
      |
      v
+-----------+        +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+        +--------------------+

'''

'''
创建一个SocketServer分三步:
一、创建BaseRequestHandler的子类并重写handle()方法
二、实例化TCPServer(或其他三种),传递IP和上面创建的子类做为参数
三、server.handle_request() #处理一个请求,一般不用
    server.serve_forever() # 处理多个请求
'''

 

'''
===============BaseServer的方法==============
fileno() 返回文件描述符
handle_request()  处理单个请求
serve_forever(poll_interval=0.5)
处理请求直到收到shutdown请求,每0.5秒检查一次是否发了shutdown
清理工作可以放在service_actions()里面
service_actions() shutdown之后的清理工作
shutdown() 停止
server_close() 关闭
allow_reuse_address()允许重用地址,看见过address already in use,
    突然断开客户端没有断开,在socket上server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
timeout() handleRequest里面用的

self.setup()  请求进来前
try:
    self.handle() 请求处理中
finally:
    self.finish()  最后
'''

 

 

服务器:

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    '''
    跟客户端所有的交互都是在handle里完成的,每次请求都新建一个Handler实例
    self.request  服务端收发数据的句柄
    self.data     存放在实例里的数据
    self.client_address[0]  客户端IP地址
    '''
    def handle(self):
        while True:
            try:
                self.data = self.request.recv(1024).decode()
                self.data = self.data.upper()
                self.request.send(self.data.encode())
            except ConnectionResetError as e:
                print("连接断开",e)
                break

if __name__ == '__main__':
    # server = socketserver.TCPServer(("127.0.0.1", 6969), MyTCPHandler)  跟之前的socket一样不支持并发
    server = socketserver.ThreadingTCPServer(("127.0.0.1", 6969), MyTCPHandler) #多线程
    # server = socketserver.ForkingTCPServer(("127.0.0.1", 6969), MyTCPHandler) #多进程,Linux里好使,Windows里不好使
    server.serve_forever()

 

客户端:

import socket

client = socket.socket()
client.connect(("127.0.0.1",6969))

while True:
    data = input(">>").strip()
    client.send(data.encode())
    data = client.recv(1024).decode()
    print(data)