public class NetworkDiscovery
{
private static final long default_broadcast_interval = 2000;
private static final String default_broadcast_host = "255.255.255.255";
private static final int default_broadcast_port = 8008;
public static final void broadcastService(String serviceName, InetSocketAddress broadcastAboutService) throws IOException
{
InetSocketAddress broadcastAddress = new InetSocketAddress(InetAddress.getByName(default_broadcast_host), default_broadcast_port);
NetworkDiscovery.broadcastService(serviceName, broadcastAddress, broadcastAboutService, default_broadcast_interval, -1);
}
public static final void broadcastService(String serviceName, InetSocketAddress broadcastAddress, InetSocketAddress broadcastAboutService, long interval, int times) throws IOException
{
InetSocketAddress bindAddress = new InetSocketAddress(InetAddress.getLocalHost(), 0);
DatagramSocket socket = new DatagramSocket(bindAddress);
byte[] packetData;
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeUTF(serviceName);
dos.writeUTF(broadcastAboutService.getHostName());
dos.writeInt(broadcastAboutService.getPort());
dos.flush();
packetData = baos.toByteArray();
}
try
{
for (int i = 0; i < times || times == -1; i++)
{
socket.send(new DatagramPacket(packetData, 0, packetData.length, broadcastAddress));
try
{
Thread.sleep(interval);
}
catch (InterruptedException exc)
{
exc.printStackTrace();
}
}
}
catch (Exception exc)
{
exc.printStackTrace();
}
}
/**
* Listens for UDP packets at the specified <code>port</code>.
* Only returns when the received packet has the specified <code>name</code>.
* This way multiple broadcasting sockets per UDP port are supported
*/
public static final InetSocketAddress discoverService(String serviceName)
{
return NetworkDiscovery.discoverService(serviceName, default_broadcast_port, 10, (int)default_broadcast_interval * 4);
}
public static final InetSocketAddress discoverService(String serviceName, int port, int maxTries, int socketTimeout)
{
try
{
int packetLength = 1024;
DatagramSocket socket = new DatagramSocket(port, InetAddress.getLocalHost());
DatagramPacket packet = new DatagramPacket(new byte[packetLength], 0, packetLength);
socket.setSoTimeout(socketTimeout);
for (int i = 0; i < maxTries; i++)
{
try
{
socket.receive(packet);
}
catch (IOException exc)
{
exc.printStackTrace();
break;
}
ByteArrayInputStream bais = new ByteArrayInputStream(packet.getData(), packet.getOffset(), packet.getLength());
DataInputStream dis = new DataInputStream(bais);
String theServiceName = dis.readUTF();
if (!theServiceName.equals(serviceName))
continue;
String notifyHost = dis.readUTF();
int notifyPort = dis.readInt();
return new InetSocketAddress(notifyHost, notifyPort);
}
}
catch (IOException exc)
{
exc.printStackTrace();
}
throw new NoSuchServiceException("Service \"" + serviceName + "\" not found");
}
public static class NoSuchServiceException extends RuntimeException
{
public NoSuchServiceException(String msg)
{
super(msg);
}
}
}