zoukankan      html  css  js  c++  java
  • socketServer并发处理socket

    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)
  • 相关阅读:
    HDU--2191 汶川地震购米(多重背包)
    PKU--1267 Cash Machine(多重背包)
    背包问题之多重背包
    NYOJ--311(完全背包)
    HDU--1114 Piggy-Bank(完全背包)
    MySQL的if,case语句
    测试一下MarkDown
    ThreadPoolExecutor介绍
    CountDownLatch的使用
    java中的信号量Semaphore
  • 原文地址:https://www.cnblogs.com/staff/p/9648064.html
Copyright © 2011-2022 走看看