• 用socketserver模块实现并发


    用socketserver模块实现并发

    在还没学并发编程前,就先使用socketserver模块来实现并发

    一、socketserver的使用(TCP协议)

    # 服务端
    
    # 导入模块
    import socketserver
    # 自己定义一个类,必须继承BaseRequestHandler
    class MyTcp(socketserver.BaseRequestHandler):
        # 必须重写handle方法
        def handle(self):
            try:
                while True:   # 通信循环
                    # print(self)
                    # 给客户端回消息
                    # conn对象就是request
                    # 接收数据
                    print(self.client_address)
                    data = self.request.recv(1024)
                    print(data)
                    if len(data) == 0:
                        return
                    # 发送数据
                    self.request.send(data.upper())
            except Exception:
                pass
    
    if __name__ == '__main__':
        # 实例化得到一个tcp连接的对象,Threading意思是说,只要来了请求,它自动的开线程来处理连接跟交互数据
        server = socketserver.ThreadingTCPServer(('127.0.0.1',8009),MyTcp)
        # 一直在监听
        # 下面这句这么理解:只要来一个请求,就起一个线程(造一个人,做交互)
        server.serve_forever()
    
    
    # 客户端
    
    import socket
    
    soc = socket.socket()
    # 建立连接
    soc.connect(('127.0.0.1',8009))
    while True:
        # 发送数据
        soc.send('xxxx'.encode('utf-8'))
        # 打印接收的数据
        print(soc.recv(1024))
    

    二、socketserver的使用(UDP协议)

    # 服务端
    
    #导入模块
    import socketserver
    
    class MyUdp(socketserver.BaseRequestHandler):
        def handle(self):
            print(self.request[0]) # b'zyl'
            print(self.request[1]) # <socket.socket fd=460, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8080)>
            print(type(self.request[1]))  # <class 'socket.socket'>
            data = self.request[0].decode('utf8')
            data = data.upper().encode('utf8')
            # self.request(tcp / udp是不一样的)
            self.request[1].sendto(data,self.client_address)  #self.client_address客户端地址
    
    if __name__ == '__main__':
        soc = socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyUdp)
        soc.serve_forever()
    
    
    # 客户端
    
    import socket
    
    soc = socket.socket(type = socket.SOCK_DGRAM)
    
    while True:
        msg = input('请输入数据>>>').strip()
        msg = msg.encode('utf8')
        soc.sendto(msg,('127.0.0.1',8080))
        data = soc.recvfrom(1024)   #他是bytes形式
        print(data[0].decode('utf-8'))  #转为str格式
    
  • 相关阅读:
    JDK8 直接定义接口中静态方法
    Spring+Netty+WebSocket实例
    基于Maven,Spring+ActiveMQ实现,贴近实际
    Netty+WebSocket简单实现网页聊天
    ActiveMQ简单入门实例
    WCF 的日志配置
    AutoMapper使用笔记
    博客园现代化建设——AutoMapper
    jqplot formatString 日期格式化列表
    MongoDB实战开发 【零基础学习,附完整Asp.net示例】
  • 原文地址:https://www.cnblogs.com/zhuangyl23/p/11508344.html
Copyright © 2020-2023  润新知