0

I am working on a P2P secure messaging app in Java, and I am starting with a broadcaster and a scanner to discover it. Unfortunately, the scanner fails to find my broadcast, and I know my broadcaster is working fine, because a python program I wrote discovers the Java broadcaster no problem

Broadcasting program, ConnectionManager.java

package main;

import javax.jmdns.JmDNS;
import javax.jmdns.ServiceInfo;
import java.io.IOException;
import java.net.InetAddress;

public class ConnectionManager {
    
    public static void main(String[] args) {
        broadcastConnection();
    }
    
    public static void broadcastConnection() {
        try {
            JmDNS jmdns = JmDNS.create(InetAddress.getLocalHost());

            String type = "_example._tcp.local.";
            String name = "ExampleService";
            int port = 12345;
            ServiceInfo serviceInfo = ServiceInfo.create(type, name, port, "path=index.html");

            jmdns.registerService(serviceInfo);
            System.out.println("Service broadcasting started. Press Enter to stop...");

            System.in.read();

            jmdns.unregisterService(serviceInfo);
            jmdns.close();
            System.out.println("Service broadcasting stopped.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Scanner program, PeerDiscovery.java

package main;

import javax.jmdns.JmDNS;
import javax.jmdns.ServiceEvent;
import javax.jmdns.ServiceInfo;
import javax.jmdns.ServiceListener;
import java.io.IOException;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

public class PeerDiscovery {
    private static final List<ServiceInfo> discoveredServices = Collections.synchronizedList(new ArrayList<>());

    public static Optional<ServiceInfo> getFirstDiscoveredService() {
        if (discoveredServices.isEmpty()) {
            return Optional.empty();
        }
        return Optional.of(discoveredServices.get(0));
    }

    private static class MyServiceListener implements ServiceListener {
        private final JmDNS jmdns;
        

        public MyServiceListener(JmDNS jmdns) {
            this.jmdns = jmdns;
        }
        
        @Override
        public void serviceAdded(ServiceEvent event) {
            System.out.println("Service added: " + event.getInfo());
            // Resolve the service immediately when added
            jmdns.requestServiceInfo(event.getType(), event.getName());
        }

        @Override
        public void serviceRemoved(ServiceEvent event) {
            System.out.println("Service removed: " + event.getName());
            synchronized (discoveredServices) {
                discoveredServices.removeIf(service -> service.getName().equals(event.getName()));
            }
        }
        @Override
        public void serviceResolved(ServiceEvent event) {
            ServiceInfo info = event.getInfo();
            System.out.println("Service resolved: " + info.getName() + " at " + info.getHostAddresses()[0] + ":" + info.getPort());
            synchronized (discoveredServices) {
                discoveredServices.add(info);
            }
        }
    }

    public static void discoverDevices() {
        try {
            JmDNS jmdns = JmDNS.create(InetAddress.getLocalHost());
            System.out.println("Service discovery started. Press Enter to stop...");
            
            jmdns.addServiceListener("_example._tcp.local.", new MyServiceListener(jmdns));

            System.in.read();

            jmdns.close();
            System.out.println("Service discovery stopped.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        discoverDevices();
    }
}

I am running ConnectionManager and PeerDiscovery on different terminals, but it still cannot find it. The weird thing that I cannot wrap my head around is that when I open a 3rd terminal and try the Python program, it discovers the broadcast AND somehow causes my PeerDiscovery.java to call only the serviceAdded() method, not serviceResolved() too.

Any tips for PeerDiscovery.java?

Thank you

0

Browse other questions tagged or ask your own question.