• PYTHON——TCP&UDP:socketserver实现多人聊天


    主要类型

      该模块有四个比较主要的类,其中常用的是 TCPServer 和 UDPServer。

      1. TCPServer

      2. UDPServer

      3. UnixStreamServer,类似于TCPServer提供面向数据流的套接字连接,但是旨在UNIX平台上可用;

      4. UnixDatagramServer,类似于UDPServer提供面向数据报的套接字连接,但是旨在UNIX平台上可用;

      这四个类型同步地处理请求,也就是说一个请求没有完成之前是不会处理下一个请求的,这种模式当然不适合生产环境,一个客户端连接就可能拖延所有的执行。所以这个模块还提供了两种支持异步处理的类: 

      5. ForkingMixIn,为每一个客户端请求派生一个新的进程去专门处理;

      6. ThreadingMixIn,为每一个客户端请求派生一个新的线程去专门处理;

      继承自这两个类型的服务端在处理新的客户端连接时不会阻塞,而是创建新的进/线程专门处理客户端的请求。

    编程框架 

      首先从高层面介绍一下使用SocketServer模块开发多进程/线程 异步服务器的流程:

      1. 根据需要选择一个合适的服务类型,如,面向TCP连接多进程服务器:  ForkingTCPServer ;

      2. 创建一个请求处理器(request handler)类型,这个类型的 handle()(类似于回调函数)方法中定义如何处理到达的客户端连接。

      3. 实例化服务器,传入服务器绑定的地址和第2步定义的请求处理器类

      4. 调用服务器实例的 handle_request() 或 serve_forever() 方法,一次或多次处理客户请求。

    实例代码:

    服务端:socket server:

    import socketserver
    import time
    
    host = ''
    port = 8000
    buffersize = 1024
    address=(host,port)
    
    class MyRequestHandler(socketserver.BaseRequestHandler):
        def handle(self):
            print('客户端已经连接,地址:{}'.format(self.client_address))
            while True:
                conn = self.request
                print('客户端地址:{}'.format(self.client_address))
                while True:
                    client_data = conn.recv(buffersize)
                    print(str(client_data,'utf8'))
                    print('waiting......')
                    # conn.sendall(time.ctime().encode(encoding='utf-8')+b' '+client_data)
              resposeStr = input('>>>')
    conn.sendall(time.ctime().encode(encoding='utf-8')+b' '+ bytes(resposeStr,'utf8'))
    conn.close()
    if __name__=='__main__':
        server = socketserver.ThreadingTCPServer(address,MyRequestHandler)
        print('正在等待客户端的连接。。。。。。')
        server.serve_forever()

    客户端:普通client

    import socket
    
    sk=socket.socket()
    address = ('127.0.0.1',8000)
    sk.connect(address)
    
    while True:
        inp = input('>>>')
        if inp=='exit':
            break
        sk.send(bytes(inp,'utf8'))
        data = sk.recv(1024)
        print(str(data,'utf-8'))
    
    sk.close()

     

  • 相关阅读:
    《TD项目开发小结》
    感悟
    毕业两年了
    ip+port无法访问nginx问题
    问题解决之道
    调休9天的那些日子
    关于类加载器(ClassLoader)
    ios核心蓝牙之心率监控(swift)
    git(git-flow)的高效管理使用
    WKWebview加载本地图片时出现路径问题
  • 原文地址:https://www.cnblogs.com/chenhaiming/p/9889095.html
Copyright © 2020-2023  润新知