def startserver(msglist, servers, clients_to): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) for i in range(55568, 55578): try: sock.bind(('localhost', i)) print('端口%d可用,绑定成功!' % i) servers.put(sock) break except Exception as e: print('Fail to bind.', e) pass sock.listen(2) #print('start on ',i) while True: netsock, address = sock.accept() print('connected from:{}'.format(str(address))) peers_to = [ key[0] + ':' + str(key[1]) for key, value in clients_to.items() ] msg = msgcreater.createmsg('network', 'serverlist_peer', '', json.dumps(peers_to), True) netsock.send(msg) msg = msgcreater.createmsg('network', 'new_peer', 'from', netsock) msglist.put(msg) t = threading.Thread(target=recv_timeout, args=(netsock, address, msglist)) t.start()
def recv_timeout(sock, addr, msglist, timeout=5): sock.setblocking(0) total_data = [] data = '' begin = time.time() while 1: if total_data and time.time() - begin > timeout: break elif time.time() - begin > timeout * 2: break try: data = sock.recv(8192) if data: data = data.decode('utf8') data = json.loads(data) if data['type'] == 'heartbeat': msg = msgcreater.createmsg('network', 'heartbeat_reply', '', '', True) try: sock.send(msg) except: pass elif data['type'] != 'heartbeat': msglist.put(data) total_data.append(data) begin = time.time() #print('---------------------\nreceive from--->',addr,'\ncontent is --->',data,'\n---------------------') else: time.sleep(0.1) except: pass msg = msgcreater.createmsg('network', 'lost_peer', 'from', addr) msglist.put(msg) sock.close() print('connection lost----->', addr)
def send_heartbeat(self): import time while self.flag: time.sleep(2) data = msgcreater.createmsg('network', 'heartbeat', '', '', True) try: self.sock.send(data) except Exception as e: self.update() self.msgqueue.put( msgcreater.createmsg('network', 'lost_peer', 'to', self.addr))
def on_receive(self): total_data = [] timeout = 5 begin = time.time() while 1: if total_data and time.time() - begin > timeout: break elif time.time() - begin > timeout * 2: break try: data = self.sock.recv(8192) if data: data = data.decode('utf8') data = json.loads(data) if data['type'] == 'heartbeat_reply': self.msgqueue.put(data) # print('heart_reply') pass elif data['type'] != 'heartbeat_reply': #print('receive data from server:') self.msgqueue.put(data) total_data.append(data) begin = time.time() # print('---------------------\nreceive from--->',addr,'\ncontent is --->',data,'\n---------------------') else: time.sleep(0.1) except Exception as e: pass self.update() self.msgqueue.put( msgcreater.createmsg('network', 'lost_peer', 'to', self.addr)) print('connection lost----->', self.addr) self.sock.close()
def connect_to_server(self, clients_to): try: if (self.addr not in list( clients_to.keys())) and len(clients_to) <= 10: self.sock.connect(self.addr) print('connected to:{}'.format(str(self.sock.getpeername()))) msg = msgcreater.createmsg('network', 'new_peer', 'to', self.sock) self.msgqueue.put(msg) return True else: return False except: return False
def __init__(self, addr, msgqueue, localserverip, localserverport, clients_to, timeout=5): self.addr = addr self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.msgqueue = msgqueue self.flag = self.connect_to_server(clients_to) if self.flag: content = localserverip + ":" + str(localserverport) handshake = msgcreater.createmsg('network', 'handshake_peer', 'from', content, True) self.sock.send(handshake) self.sock.setblocking(0) threading.Thread(target=self.send_heartbeat).start() threading.Thread(target=self.on_receive).start()