diff --git a/ws2012/P2P/uebungen/4/src/node/Ack.java b/ws2012/P2P/uebungen/4/src/node/Ack.java index 9583db1e..9e90c87d 100644 --- a/ws2012/P2P/uebungen/4/src/node/Ack.java +++ b/ws2012/P2P/uebungen/4/src/node/Ack.java @@ -23,14 +23,10 @@ public class Ack { // The channel to re-send the message on private DatagramChannel channel; - OnAckReceive callback; - - public Ack(int id, SocketAddress address, DatagramChannel channel, - OnAckReceive onReceive) { + public Ack(int id, SocketAddress address, DatagramChannel channel) { this.id = id; this.address = address; this.channel = channel; - this.callback = onReceive; startThread(); } @@ -58,10 +54,6 @@ public class Ack { } public void setReceived() { - if (callback != null) { - callback.onReceive(); - } - // Stop thread try { if (thread != null) { diff --git a/ws2012/P2P/uebungen/4/src/node/Node.java b/ws2012/P2P/uebungen/4/src/node/Node.java index 8947f246..4bb626da 100644 --- a/ws2012/P2P/uebungen/4/src/node/Node.java +++ b/ws2012/P2P/uebungen/4/src/node/Node.java @@ -40,8 +40,6 @@ public class Node { private Random generator; - protected boolean receivedAckForLastInvite; - public Node() { System.setProperty("java.net.preferIPv4Stack", "true"); generator = new Random(System.currentTimeMillis()); @@ -75,7 +73,6 @@ public class Node { LOGGER.log(Level.FINE, "Name: " + getName() + ", Spawning new node."); Node newNode = new Node(); addNeighbor(newNode.getAddress()); - receivedAckForLastInvite = false; sendInvite(newNode); return newNode; @@ -84,12 +81,7 @@ public class Node { private boolean sendInvite(final Node newNode) { ByteBuffer buffer = ByteBuffer.allocate(BUF_SIZE); - Ack ack = generateAck(newNode.getAddress(), new OnAckReceive() { - @Override - public void onReceive() { - receivedAckForLastInvite = true; - } - }); + Ack ack = generateAck(newNode.getAddress()); buffer.put(MessageType.INVITE); buffer.putInt(ack.getId()); @@ -113,12 +105,12 @@ public class Node { * the SocketAddress the ack should be received from * @return the identifier for this ack */ - private Ack generateAck(final SocketAddress addr, OnAckReceive callback) { + private Ack generateAck(final SocketAddress addr) { int ack_id = generator.nextInt(); while (acks.containsKey(ack_id)) { ack_id = generator.nextInt(); } - Ack newAck = new Ack(ack_id, addr, channel, callback); + Ack newAck = new Ack(ack_id, addr, channel); acks.put(ack_id, newAck); return newAck; @@ -223,6 +215,11 @@ public class Node { public void gatherInformationOfNetwork() { network = new HashMap>(); + network.put(getName(), new ArrayList()); + for (SocketAddress n : neighbors) { + network.get(getName()).add(n.toString()); + } + try { byte[] myAddr = BufferUtil.addrToBytes(((InetSocketAddress) channel .getLocalAddress())); @@ -268,7 +265,7 @@ public class Node { int idToRemove = getNeighborId(node); if (idToRemove != -1) { removed = neighbors.remove(idToRemove); - network.get(getName()).remove(node.toString()); + network.get(getName()).remove(node.toString()); } return removed != null; @@ -279,7 +276,8 @@ public class Node { * from the network. */ public void leave() { - if (!receivedAckForLastInvite || neighbors.isEmpty()) { + // if (!receivedAckForLastInvite || neighbors.isEmpty()) { + if (!acks.isEmpty() || neighbors.isEmpty()) { // This means the bootstrapping has not been finished. Either I have // not been invited by a node, or the Node I invited didn't ack by // now @@ -289,7 +287,7 @@ public class Node { for (int i = 0; i < neighbors.size(); i++) { ByteBuffer buffer = ByteBuffer.allocate(BUF_SIZE); - Ack ack = generateAck(neighbors.get(i), null); + Ack ack = generateAck(neighbors.get(i)); buffer.put(MessageType.LEAVE); buffer.putInt(ack.getId());