Send/receive status

This commit is contained in:
senft-desktop 2012-11-29 19:56:22 +01:00
parent e6e8b234eb
commit f5eba59b19
2 changed files with 50 additions and 19 deletions

View File

@ -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);
}

View File

@ -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()) });