Обнаружение сети через дейтаграммы: многоадресная рассылка - PullRequest
0 голосов
/ 09 декабря 2011

Я реализую пример, когда сервер прослушивает любые активные клиенты в сети.

Я использую сокеты дейтаграмм для сервера, чтобы выполнить многоадресную рассылку, и клиенты отвечают на сервер.

public void run() {

    try {
        byte[] recvBuf = new byte[15000];
        DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
        DatagramSocket dSock = new DatagramSocket(4445);
        dSock.receive(packet);
        int byteCount = packet.getLength();
        ByteArrayInputStream byteStream = new ByteArrayInputStream(recvBuf);
        ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(byteStream));
        }

}

и на стороне клиента:

public void run() {
    {
     ObjectOutputStream os = null;
        try {
            InetAddress address = InetAddress.getByName("Server's IP");//Note!
            ByteArrayOutputStream byteStream = new ByteArrayOutputStream(15000);
            os = new ObjectOutputStream(new BufferedOutputStream(byteStream));
            os.flush();
              os.flush();
            byte[] sendBuf = byteStream.toByteArray();
            DatagramPacket packet = new DatagramPacket(sendBuf, sendBuf.length, address, 4445);
            int byteCount = packet.getLength();
            }
     }

}

В приведенном выше примере клиент должен знать серверIP apriori (жесткий код).Как я могу изменить код на стороне сервера так, чтобы сервер отправлял свой IP клиенту, а клиент отвечал на него?

Мне удалось сделать это с помощью сокетов, но возможно ли это с помощью сокетов дейтаграмм?

Спасибо!

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

Вы можете использовать DatgramPacket.getAddress () и ответить отправителю

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

0 голосов
/ 19 мая 2013

Попробуйте получить hostAddress, используя InetAddress.getHostAddress, прочитайте часть IP и передайте ее в переменную.

InetAddress address = InetAddress.getByName("[variable]");

или

InetAddress address = InetAddress.getByAddress("[variable]");

Я надеюсь, что любой из них приведет к лучшему пути.

...