.receive() is now non-blocking, in order to terminate the listen thread

This commit is contained in:
senft-lap 2012-11-20 15:06:21 +01:00
parent e68f306568
commit acfad4df4d

View File

@ -26,13 +26,15 @@ public class Node {
private List<SocketAddress> neighbors = new ArrayList<SocketAddress>();
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()));
}
}
}