From acfad4df4de30ba83d7c44c9e0d672723736b257 Mon Sep 17 00:00:00 2001 From: senft-lap Date: Tue, 20 Nov 2012 15:06:21 +0100 Subject: [PATCH] .receive() is now non-blocking, in order to terminate the listen thread --- ws2012/P2P/uebungen/4/src/peer/Node.java | 159 +++++++++++++---------- 1 file changed, 88 insertions(+), 71 deletions(-) diff --git a/ws2012/P2P/uebungen/4/src/peer/Node.java b/ws2012/P2P/uebungen/4/src/peer/Node.java index 55191212..4fc87ff2 100644 --- a/ws2012/P2P/uebungen/4/src/peer/Node.java +++ b/ws2012/P2P/uebungen/4/src/peer/Node.java @@ -26,13 +26,15 @@ public class Node { private List neighbors = new ArrayList(); - private Thread thread; + private volatile Thread thread; private UDPListen udpListen; public Node() { try { channel = DatagramChannel.open(); channel.socket().bind(null); + channel.configureBlocking(false); + buf = ByteBuffer.allocate(BUF_SIZE); this.name = channel.socket().getLocalSocketAddress().toString(); @@ -189,86 +191,101 @@ public class Node { public void run() { StringBuilder sb_received; + while (running) { SocketAddress receivedFrom = null; buf.clear(); try { receivedFrom = channel.receive(buf); + + if (buf.remaining() != 512) { + buf.flip(); + + byte messageType = buf.get(); + + switch (messageType) { + case MessageType.INVITE: + LOGGER.info(name + " received invite from " + + receivedFrom.toString()); + neighbors.add(receivedFrom); + break; + + case MessageType.LEAVE: + LOGGER.info(receivedFrom.toString() + + " is leaving. Deleting..."); + neighbors.remove(receivedFrom); + break; + + case MessageType.NEW_NEIGHBOR_IPV4: + LOGGER.info(name + " received new IPV4 neighbor" + + receivedFrom.toString() + ": " + + new String(buf.array())); + + byte[] byte_addr = new byte[7]; + + // Read 4 Bytes and 1 Int + for (int i = 0; i < 8; i = i + 2) { + byte_addr[i] = buf.get(); + if (i < 7) + byte_addr[i + 1] = '.'; + } + + int port = buf.getInt(); + + neighbors.add(new InetSocketAddress(new String( + byte_addr), port)); + + // TODO: send PING to new neighbor and expect wait + // to + // get a + // PONG + + break; + case MessageType.NEW_NEIGHBOR_IPV6: + LOGGER.info(name + + " received new IPV6 neighbor from: " + + receivedFrom.toString() + ": " + + new String(buf.array())); + + sb_received = new StringBuilder(512); + while (buf.hasRemaining()) { + sb_received.append((char) buf.get()); + } + + String str_received = sb_received.toString(); + + int startOfPort = str_received.lastIndexOf(":"); + + String new_hostname = str_received.substring(1, + startOfPort); + int new_port = Integer.valueOf(str_received + .substring(startOfPort + 1)); + + SocketAddress new_neighbor = new InetSocketAddress( + new_hostname, new_port); + neighbors.add(new_neighbor); + + break; + + default: + LOGGER.info(name + + " received unknown command from " + + receivedFrom.toString() + ": " + + new String(buf.array())); + } + } else { + try { + Thread.sleep(10); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } } catch (IOException e) { e.printStackTrace(); } - buf.flip(); - - byte messageType = buf.get(); - - switch (messageType) { - case MessageType.INVITE: - LOGGER.info(name + " received invite from " - + receivedFrom.toString()); - neighbors.add(receivedFrom); - break; - - case MessageType.LEAVE: - LOGGER.info(receivedFrom.toString() - + " is leaving. Deleting..."); - neighbors.remove(receivedFrom); - break; - - case MessageType.NEW_NEIGHBOR_IPV4: - LOGGER.info(name + " received new IPV4 neighbor" - + receivedFrom.toString() + ": " - + new String(buf.array())); - - byte[] byte_addr = new byte[7]; - - // Read 4 Bytes and 1 Int - for (int i = 0; i < 8; i = i + 2) { - byte_addr[i] = buf.get(); - if (i < 7) - byte_addr[i + 1] = '.'; - } - - int port = buf.getInt(); - - neighbors.add(new InetSocketAddress(new String(byte_addr), - port)); - - // TODO: send PING to new neighbor and expect wait to get a - // PONG - - break; - case MessageType.NEW_NEIGHBOR_IPV6: - LOGGER.info(name + " received new IPV6 neighbor from: " - + receivedFrom.toString() + ": " - + new String(buf.array())); - - sb_received = new StringBuilder(512); - while (buf.hasRemaining()) { - sb_received.append((char) buf.get()); - } - - String str_received = sb_received.toString(); - - int startOfPort = str_received.lastIndexOf(":"); - - String new_hostname = str_received - .substring(1, startOfPort); - int new_port = Integer.valueOf(str_received - .substring(startOfPort + 1)); - - SocketAddress new_neighbor = new InetSocketAddress( - new_hostname, new_port); - neighbors.add(new_neighbor); - - break; - - default: - LOGGER.info(name + " received unknown command from " - + receivedFrom.toString() + ": " - + new String(buf.array())); - } } }