zoukankan      html  css  js  c++  java
  • 异步io模块(自定义)

    '''客户端'''
    import   socket,select
    #####进行封装,将socket对象和要返回的url,和回调函数进行一下封装
    class   Httprequest():
        def  __init__(self,sk,host,callback):
            self.socket=sk
            self.host=host#####这个host就是www.baidu.ocm,根据这个域名可以获取到相对应的ip出来
            self.callback=callback
            ##不一定是socket,只要在监听的对象里面可以有fileno方法,并且可以返回socket对象里面的文件描述符就可以
        def    fileno(self):
            return  self.socket.fileno()
        ###只要监听的对象里面的fileno方法返回的是文件描述符就可以放在select里面
    
    
    
    class   Main():
        def  __init__(self):
            self.conn=[]
            self.conection=[]
    
    
        def  add_request(self,host,callback):##########传到里面来
            try:
                sk = socket.socket()##创建socket对象
                sk.setblocking(False)
                # sk.accept()
                sk.connect((host, 80,))
    
    
                # self.conection.append(sk)
            except  BlockingIOError  as  e:
                pass
            #########进行下面的封装的操作
            request = Httprequest(sk, host, callback)
            # self.conn.append(sk)
            self.conn.append(request)
            self.conection.append(request)
            print(self.conn)
            print(self.conection)
    
    
        def   create(self):
            rlist,wlist,elist=select.select(self.conn,self.conection,self.conn,0.05)###第一个监听的是建立通信的socket对象,第二个监听的是建立连接的socket的对象,第三个是发生异常的socket对象,最后一个是最多延迟多少秒
            for  socket_obj  in   wlist:
                data = 'GET / HTTP/1.0/r/nHost:%s
    
    ' % (socket_obj.host)#####注意一下格式问题
                socket_obj.socket.send(bytes(data, encoding='utf-8'))##注意是里面封装好的socket发送数据过来
                ####注意,发送数据是以字节得形式发送过去
                self.conection.remove(socket_obj)
    
        #############下面是开始进行通信的socket对象
            for   r  in rlist:
                chunks = bytes()  ###设置全部的chunk数据
                try:
                    while True:
                        chunk = r.socket.recv(8096)
                        chunks += chunk######可以对接受的数据进行处理
                except  Exception  as e:
                    print(e)##有数据就去拿数据,没有数据就会保错
                print('有数据返回',chunks)#####拿到返回的全部的数据,每一个socket拿到的通行之间的数据
                r.callback(chunks)#############调用这个r里面的callback函数,进行保存数据等操作
                r.socket.close()
                self.conn.remove(r)#####这个r是socket对象,wlist,rlist里面的都是socket对象,这个socket是封装好的,有url,socket,callback,可以直接进行调用
                if len(self.conn)==0:
                    break
    
    def  f1(chunks):##可以对接收到的数据进行保存在数据等操作
        print('运行fun1')
    
    
    def   f2(chunks):
        print('运行fun2')
    
    
    def  f3(chunks):
        print('运行fun3')
    
    url_list=[
        {'host':'www.baidu.com','callback':f1},
        {'host':'www.baidu.com','callback':f2},
        {'host': 'www.baidu.com', 'callback':f3},
    ]
    
    req=Main()
    for  item  in  url_list:
        req.add_request(item['host'],item['callback'])
    req.create()
  • 相关阅读:
    android background属性问题
    AlertDialog 设置不同按钮的样式
    springboot controller统一异常处理
    springboot 配置自定义拦截器
    Linux中proc信息获取
    AliCloud-tools【分享】
    sql列转行
    算法
    静态变量与代码块
    AbstractQueuedSynchronizer(AQS)
  • 原文地址:https://www.cnblogs.com/yunxintryyoubest/p/10037228.html
Copyright © 2011-2022 走看看