Send/receive status
This commit is contained in:
parent
e6e8b234eb
commit
f5eba59b19
@ -202,6 +202,20 @@ public class Node {
|
||||
}
|
||||
}
|
||||
|
||||
protected void sendStatus(InetSocketAddress reveiver) {
|
||||
ByteBuffer buffer = ByteBuffer.allocate(BUF_SIZE);
|
||||
buffer.put(MessageType.STATUS);
|
||||
for (SocketAddress n : neighbors) {
|
||||
buffer.put(BufferUtil.addrToBytes((InetSocketAddress) n));
|
||||
}
|
||||
|
||||
try {
|
||||
channel.send(buffer, reveiver);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void gatherInformationOfNetwork() {
|
||||
byte[] myAddr;
|
||||
try {
|
||||
@ -222,7 +236,7 @@ public class Node {
|
||||
protected Ack getAck(int ack_id) {
|
||||
return acks.get(ack_id);
|
||||
}
|
||||
|
||||
|
||||
protected Ack removeAck(int ack_id) {
|
||||
return acks.remove(ack_id);
|
||||
}
|
||||
|
||||
@ -4,7 +4,9 @@ import java.io.IOException;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.SocketAddress;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
@ -31,7 +33,7 @@ public class UDPHandler implements Runnable {
|
||||
}
|
||||
|
||||
private void receiveInvite(SocketAddress from) {
|
||||
LOGGER.log(Level.INFO, "{0} received invite from {1}", new Object[] {
|
||||
LOGGER.log(Level.INFO, "{0}: received invite from {1}", new Object[] {
|
||||
node.getName(), from.toString() });
|
||||
int ack_id = buf.getInt();
|
||||
node.sendAck(from, ack_id);
|
||||
@ -41,7 +43,8 @@ public class UDPHandler implements Runnable {
|
||||
private void receiveAck(SocketAddress from) {
|
||||
int ack_id = buf.getInt();
|
||||
|
||||
LOGGER.log(Level.INFO, "{0} received ack ({1}) from {2}", new Object[] {
|
||||
LOGGER.log(Level.INFO, "{0}: received ack ({1}) from {2}",
|
||||
new Object[] {
|
||||
node.getName(), ack_id, from.toString() });
|
||||
|
||||
if (node.hasAck(ack_id)) {
|
||||
@ -54,17 +57,6 @@ public class UDPHandler implements Runnable {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isNewBroadcast(int id) {
|
||||
boolean isNew = true;
|
||||
if (broadcastPackets.containsKey(id)) {
|
||||
long receivedAt = broadcastPackets.get(id);
|
||||
if (receivedAt < System.currentTimeMillis() + BROADCAST_TIMEOUT) {
|
||||
isNew = false;
|
||||
}
|
||||
}
|
||||
return isNew;
|
||||
}
|
||||
|
||||
private void receiveLeave(SocketAddress from) {
|
||||
LOGGER.log(Level.INFO, "{0}: {1} is leaving. Deleting...",
|
||||
new Object[] { node.getName(), from.toString() });
|
||||
@ -81,6 +73,7 @@ public class UDPHandler implements Runnable {
|
||||
int packet_id = buf.getInt();
|
||||
byte command = buf.get();
|
||||
if (isNewBroadcast(packet_id)) {
|
||||
// Save packet id so we don't forward a packet multiple times
|
||||
broadcastPackets.put(packet_id, System.currentTimeMillis());
|
||||
|
||||
switch (command) {
|
||||
@ -97,7 +90,7 @@ public class UDPHandler implements Runnable {
|
||||
new Object[] { node.getName(), from.toString(),
|
||||
originalSender.toString() });
|
||||
|
||||
// TODO: Answer with 'my' neighbors
|
||||
node.sendStatus(originalSender);
|
||||
|
||||
break;
|
||||
default:
|
||||
@ -110,11 +103,21 @@ public class UDPHandler implements Runnable {
|
||||
}
|
||||
} else {
|
||||
LOGGER.log(Level.INFO,
|
||||
"Received duplicate broadcast packet ({0}). Discarding...",
|
||||
new Object[] { packet_id });
|
||||
"{0}: Received duplicate broadcast packet ({0}). Discarding...",
|
||||
new Object[] { node.getName(), packet_id });
|
||||
}
|
||||
}
|
||||
|
||||
private void receiveStatus(SocketAddress receivedFrom) {
|
||||
List<SocketAddress> neighbors = new ArrayList<SocketAddress>();
|
||||
|
||||
while (buf.hasRemaining()) {
|
||||
neighbors.add(readIPFromBuffer());
|
||||
}
|
||||
|
||||
// Keep track of all neighbors..
|
||||
}
|
||||
|
||||
private InetSocketAddress readIPFromBuffer() {
|
||||
StringBuilder theAddr = new StringBuilder();
|
||||
// Read 4 Bytes and 1 Integer = 1 IP address
|
||||
@ -138,13 +141,24 @@ public class UDPHandler implements Runnable {
|
||||
|
||||
LOGGER.log(
|
||||
Level.INFO,
|
||||
"{0} from {1} received new neighbor:{2}",
|
||||
"{0}: from {1} received new neighbor:{2}",
|
||||
new Object[] { node.getName(), from.toString(),
|
||||
newNeighbor.toString() });
|
||||
|
||||
node.sendAck(from, ack_id);
|
||||
}
|
||||
|
||||
private boolean isNewBroadcast(int id) {
|
||||
boolean isNew = true;
|
||||
if (broadcastPackets.containsKey(id)) {
|
||||
long receivedAt = broadcastPackets.get(id);
|
||||
if (receivedAt < System.currentTimeMillis() + BROADCAST_TIMEOUT) {
|
||||
isNew = false;
|
||||
}
|
||||
}
|
||||
return isNew;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
SocketAddress receivedFrom = null;
|
||||
|
||||
@ -175,10 +189,13 @@ public class UDPHandler implements Runnable {
|
||||
case MessageType.BROADCAST:
|
||||
receiveBroadcast(receivedFrom);
|
||||
break;
|
||||
case MessageType.STATUS:
|
||||
receiveStatus(receivedFrom);
|
||||
break;
|
||||
default:
|
||||
LOGGER.log(
|
||||
Level.INFO,
|
||||
"{0} received unknown command from {1}: [{2}]{3}",
|
||||
"{0}: received unknown command from {1}: [{2}]{3}",
|
||||
new Object[] { node.getName(),
|
||||
receivedFrom.toString(), messageType,
|
||||
new String(buf.array()) });
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user