zoukankan      html  css  js  c++  java
  • 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()

     

  • 相关阅读:
    POJ 1795 DNA Laboratory
    CodeForces 303B Rectangle Puzzle II
    HDU 2197 本源串
    HDU 5965 扫雷
    POJ 3099 Go Go Gorelians
    CodeForces 762D Maximum path
    CodeForces 731C Socks
    HDU 1231 最大连续子序列
    HDU 5650 so easy
    大话接口隐私与安全 转载
  • 原文地址:https://www.cnblogs.com/chenhaiming/p/9889095.html
Copyright © 2011-2022 走看看