Newer
Older
democall3 / src / discovery / server / ServiceLocator.java
package discovery.server;

import constants.Constants;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketTimeoutException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Mark
 */
public class ServiceLocator {

	private static final Logger LOG = Logger.getLogger(ServiceLocator.class.getName());

	/**
	 * Send a multi-cast request for any democall servers. Server should respond
	 * with its IP address.
	 *
	 * @param lab The lab in which to search for a server.
	 * @return IP address of server
	 * @throws Exception
	 */
	public String locateServer(final String lab) {
		try {
			final DatagramSocket socket = new DatagramSocket();

			socket.setSoTimeout(Constants.SERVICE_LOCATOR_TIMEOUT);

			final InetAddress address = InetAddress.getByName(Constants.BROADCAST_ADDRESS);
			final byte[] data = lab.getBytes();
			final int port = Constants.PORT;

			socket.send(new DatagramPacket(data, data.length, address, port));
			final byte[] response = new byte[256];
			final DatagramPacket packet = new DatagramPacket(response, response.length);

			socket.receive(packet);
			final String receivedIp = new String(packet.getData()).trim();
			socket.close();
			return receivedIp;
		} catch (SocketTimeoutException ex) {
			throw new ServiceNotFoundException();
		} catch (Exception ex) {
			LOG.log(Level.SEVERE, null, ex);
		}
		return null;
	}

}