def init_peers(port): global local_peer local_peer = Peer(get_local_ip(), port) add_peer(local_peer) debug.output(debug.info, '[init_peers] start to look for peers') find_peers() debug.output(debug.info, '[init_peers] look for peers ended') debug.output(debug.info, '[init_peers] broadcast known peers') network.broadcast_message(messages.PeersMessage(get_known_peers())) debug.output(debug.info, '[init_peers] broadcasted known peers')
def broadcast_message(msg): for peer in list(peers.get_known_peers()): if peer != peers.get_local_peer(): debug.output(debug.info, '[broadcast] send %s to ' % str(type(msg)) + str(peer)) sender = client.Sender(peer) sender.send_message(msg) debug.output(debug.info, '[broadcast] sent %s to ' % str(type(msg)) + str(peer)) del sender debug.output(debug.info, '[broadcast] close connection to ' + str(peer))
def send_message(self, msg): if not self.connected: debug.output(debug.verbose, '[sender] try connect to %s' % str(self.peer)) self.s.connect((self.peer.ip, self.peer.port)) self.connected = True debug.output(debug.verbose, '[sender] connected to %s' % str(self.peer)) debug.output(debug.verbose, '[sender] send %s to %s' % (str(msg), str(self.peer))) content = wrap_message(msg) self.s.send(content) content_length = int(receive(self.s, 10)) return decode_from_bytes(receive(self.s, content_length))
def find_peers(): global known_peers for peer in list(known_peers): if peer == get_local_peer(): continue debug.output(debug.info, '[find_peers] send GetPeersMessage to ' + str(peer)) sender = client.Sender(peer) peers_message = sender.send_message(messages.GetPeersMessage()) debug.output(debug.info, '[find_peers] sent GetPeersMessage to ' + str(peer)) for new_peer in peers_message.peers: add_peer(new_peer) del sender debug.output(debug.info, '[find_peers] close connection to ' + str(peer))
def handle(self): debug.output( debug.info, '[server] new connection from ' + str(self.client_address)) content_length = int(receive(self.request, 10)) msg = decode_from_bytes(receive(self.request, content_length)) if isinstance(msg, HeartbeatMessage): debug.output(debug.info, msg.timestamp) self.request.send(wrap_message(HeartbeatMessage())) elif isinstance(msg, GetPeersMessage): debug.output( debug.info, '[server] receive %s from ' % str(type(msg)) + str(self.client_address)) debug.output(debug.info, '[server] send to ' + str(self.client_address)) self.request.send( wrap_message(PeersMessage(peers.get_known_peers()))) debug.output(debug.info, '[server] sent to ' + str(self.client_address)) elif isinstance(msg, PeersMessage): debug.output( debug.info, '[server] receive %s from ' % str(type(msg)) + str(self.client_address)) for peer in msg.peers: peers.add_peer(peer) self.request.send(wrap_message(HeartbeatMessage())) else: handle_message(msg) self.request.send(wrap_message(HeartbeatMessage())) debug.output(debug.info, '[server] exit handle')
def handle_message(obj): debug.output(debug.info, '[handle_message] receive %s' % str(type(obj))) # TODO: jas0n1ee # receive an message object # return an object as a response return
def add_peer(peer): if peer not in known_peers: debug.output(debug.running, '[add_peer] new peer: ' + str(peer)) known_peers.add(peer)