summaryrefslogtreecommitdiffstats
path: root/src/main/java/derms/replica2/Announcer.java
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2024-11-28 17:32:28 -0500
committerSam Anthony <sam@samanthony.xyz>2024-11-28 17:32:28 -0500
commitd267dd1dda606f0c56d8afaa7187485e60ebfd86 (patch)
treee1bca5933aa7e5e9793773057fd5616ff65a9eb8 /src/main/java/derms/replica2/Announcer.java
parent6654546671eea9f9becd32b3160a134802659cbc (diff)
downloadsoen423-d267dd1dda606f0c56d8afaa7187485e60ebfd86.zip
move replica2 to top level
Diffstat (limited to 'src/main/java/derms/replica2/Announcer.java')
-rw-r--r--src/main/java/derms/replica2/Announcer.java69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/main/java/derms/replica2/Announcer.java b/src/main/java/derms/replica2/Announcer.java
new file mode 100644
index 0000000..508349e
--- /dev/null
+++ b/src/main/java/derms/replica2/Announcer.java
@@ -0,0 +1,69 @@
+package derms.replica2;
+
+import java.io.IOException;
+import java.net.*;
+import java.util.logging.Logger;
+
+class Announcer implements Runnable {
+ static final long intervalMillis = 3000;
+
+ private SocketAddress group;
+ private InetAddress localAddr;
+ private City city;
+ private Logger log;
+
+ Announcer(SocketAddress group, InetAddress localAddr, City city) throws IOException {
+ this.group = group;
+ this.localAddr = localAddr;
+ this.city = city;
+ this.log = DermsLogger.getLogger(this.getClass());
+ }
+
+ @Override
+ public void run() {
+ NetworkInterface netInterface = null;
+ try {
+ netInterface = NetworkInterface.getByInetAddress(localAddr);
+ if (netInterface == null) {
+ throw new Exception("netInterface is null");
+ }
+ } catch (Exception e) {
+ log.severe("Failed to get network interface bound to "+localAddr.toString()+": "+e.getMessage());
+ return;
+ }
+
+ MulticastSocket sock = null;
+ try {
+ sock = new MulticastSocket();
+ sock.joinGroup(group, netInterface);
+ } catch (Exception e) {
+ log.severe("Failed to open multicast socket: "+e.getMessage());
+ return;
+ }
+
+ log.info("Announcing from "+localAddr.toString()+" ("+netInterface.getName()+") to "+group.toString());
+
+ DatagramPacket pkt = null;
+ try {
+ pkt = ObjectPacket.create(city, group);
+ } catch (IOException e) {
+ log.severe("Failed to create packet: "+e.getMessage());
+ sock.close();
+ return;
+ }
+
+ try {
+ for (;;) {
+ sock.send(pkt);
+ Thread.sleep(intervalMillis);
+ }
+ } catch (IOException e) {
+ log.severe("Failed to send to multicast socket "+group.toString()+": "+e.getMessage());
+ } catch (InterruptedException e) {
+ log.info("Interrupted.");
+ } finally {
+ log.info("Shutting down...");
+ sock.close();
+ }
+ }
+} \ No newline at end of file