'''客户端''' 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()