Подтвердить что ты не робот

Android - найти сервер в сети

В настоящее время я пишу приложение клиент-сервер, и я спрашиваю себя, есть ли лучший способ найти сервер в локальной сети, а затем пройти через все доступные IP-адреса и посмотреть, будет ли предоставлен правильный ответ?

4b9b3361

Ответ 1

Возможно, вы захотите посмотреть в широковещательных передачах UDP, где ваш сервер объявляет о себе, и телефон прослушивает трансляции.


Ниже приведен пример из удаленного проекта Boxee, приведенного ниже.

Получение широковещательного адреса

Вам нужно получить доступ к диспетчеру wifi для получения информации DHCP и построить из него широковещательный адрес:

InetAddress getBroadcastAddress() throws IOException {
    WifiManager wifi = mContext.getSystemService(Context.WIFI_SERVICE);
    DhcpInfo dhcp = wifi.getDhcpInfo();
    // handle null somehow

    int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
    byte[] quads = new byte[4];
    for (int k = 0; k < 4; k++)
      quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);
    return InetAddress.getByAddress(quads);
}

Отправка и получение пакетов широковещательной передачи UDP

Создав широковещательный адрес, все работает нормально. Следующий код отправляет строковые данные по широковещанию, а затем ждет ответа:

DatagramSocket socket = new DatagramSocket(PORT);
socket.setBroadcast(true);
DatagramPacket packet = new DatagramPacket(data.getBytes(), data.length(),
    getBroadcastAddress(), DISCOVERY_PORT);
socket.send(packet);

byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);

Вы также можете изучить Bonjour/zeroconf, и есть Java-реализация, которая должна работать на Android.