diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2024-11-15 17:03:21 -0500 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2024-11-15 17:03:21 -0500 |
| commit | 050942608e70d01e5833fe5d0e5019071f95c68b (patch) | |
| tree | 0e4c285c4290def09877a9e5378861a03d0ee088 /src/main/java/derms/net/rmulticast/Announce.java | |
| parent | 5a7cc1873ade99634726042d97a9d91d382867ad (diff) | |
| download | soen423-050942608e70d01e5833fe5d0e5019071f95c68b.zip | |
reliable multicast: announce presence to group
Diffstat (limited to 'src/main/java/derms/net/rmulticast/Announce.java')
| -rw-r--r-- | src/main/java/derms/net/rmulticast/Announce.java | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/main/java/derms/net/rmulticast/Announce.java b/src/main/java/derms/net/rmulticast/Announce.java new file mode 100644 index 0000000..08d817d --- /dev/null +++ b/src/main/java/derms/net/rmulticast/Announce.java @@ -0,0 +1,47 @@ +package derms.net.rmulticast; + +import derms.net.ConcurrentMulticastSocket; +import derms.net.Packet; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.time.Duration; +import java.util.logging.Logger; + +/** + * Periodically announce the presence of the local process to the group. + * Allows processes to populate their set of group members, even if not + * all members would normally send messages to the group. + */ +class Announce implements Runnable { + private static final Duration period = Duration.ofSeconds(30); + + private final DatagramPacket pkt; + private final ConcurrentMulticastSocket outSock; + private final Logger log; + + Announce(InetSocketAddress group, InetAddress laddr, ConcurrentMulticastSocket outSock) throws IOException { + AnnounceMessage msg = new AnnounceMessage(laddr); + this.pkt = Packet.encode(msg, group); + this.outSock = outSock; + this.log = Logger.getLogger(this.getClass().getName()); + } + + @Override + public void run() { + try { + for (;;) { + try { + Wait.forDuration(period); + outSock.send(pkt); + } catch (IOException e) { + log.warning(e.getMessage()); + } + } + } catch (InterruptedException e) { + log.info("Announce thread interrupted: " + e.getMessage()); + } + } +} |