Cleaned up how broadcast works

This commit is contained in:
nathan 2018-02-22 00:48:27 +01:00
parent d021340878
commit 42934696f4

View File

@ -19,36 +19,42 @@ import java.net.InetSocketAddress;
import dorkbox.network.Broadcast; import dorkbox.network.Broadcast;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled; import io.netty.channel.Channel;
import io.netty.channel.socket.DatagramPacket;
/** /**
* * Manages the response to broadcast events
*/ */
public public
class BroadcastServer { class BroadcastServer {
private final org.slf4j.Logger logger; private final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(BroadcastServer.class.getSimpleName());
private final ByteBuf discoverResponseBuffer;
public public
BroadcastServer() { BroadcastServer() {
this.logger = org.slf4j.LoggerFactory.getLogger(BroadcastServer.class.getSimpleName());
// absolutely MUST send packet > 0 across, otherwise netty will think it failed to write to the socket, and keep trying.
// (this bug was fixed by netty, however we are keeping this code)
this.discoverResponseBuffer = Unpooled.buffer(1);
this.discoverResponseBuffer.writeByte(Broadcast.broadcastResponseID);
} }
public ByteBuf getBroadcastResponse(ByteBuf byteBuf, InetSocketAddress remoteAddress) { /**
* @return true if the broadcast was responded to, false if it was not a broadcast (and there was no response)
*/
public boolean isBroadcast(final Channel channel, ByteBuf byteBuf, final InetSocketAddress localAddress, InetSocketAddress remoteAddress) {
if (byteBuf.readableBytes() == 1) { if (byteBuf.readableBytes() == 1) {
// this is a BROADCAST discovery event. Don't read the byte unless it is... // this is a BROADCAST discovery event. Don't read the byte unless it is...
if (byteBuf.getByte(0) == Broadcast.broadcastID) { if (byteBuf.getByte(0) == Broadcast.broadcastID) {
byteBuf.readByte(); // read the byte to consume it (now that we verified it is a broadcast byte) byteBuf.readByte(); // read the byte to consume it (now that we verified it is a broadcast byte)
// absolutely MUST send packet > 0 across, otherwise netty will think it failed to write to the socket, and keep trying.
// (this bug was fixed by netty, however we are keeping this code)
ByteBuf directBuffer = channel.alloc()
.directBuffer(1);
directBuffer.writeByte(Broadcast.broadcastResponseID);
channel.writeAndFlush(new DatagramPacket(directBuffer, remoteAddress, localAddress));
logger.info("Responded to host discovery from: {}", remoteAddress); logger.info("Responded to host discovery from: {}", remoteAddress);
return discoverResponseBuffer; return true;
} }
} }
return null; return false;
} }
} }