.receive() is now non-blocking, in order to terminate the listen thread
This commit is contained in:
parent
e68f306568
commit
acfad4df4d
@ -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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user