Несколько клиентов Netty, прослушивающих одну и ту же группу многоадресной рассылкиJAVA

Программисты JAVA общаются здесь
Ответить
Гость
 Несколько клиентов Netty, прослушивающих одну и ту же группу многоадресной рассылки

Сообщение Гость »

Я пытаюсь заставить несколько клиентов Netty прослушивать один и тот же адрес группы многоадресной рассылки.
Проблема с запуском этих клиентов на одном компьютере заключается в том, что каждый клиент привязан к одному и тому же порту. (групповой порт), что приводит к конфликту портов.
Как правило, можно запускать несколько клиентов, прослушивающих один и тот же адрес, так как этого можно добиться с помощью Netty?
Вот код клиента:

Код: Выделить всё

package com.something.tools.udp;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOption;
import io.netty.channel.FixedRecvByteBufAllocator;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.DatagramChannel;
import io.netty.channel.socket.DatagramPacket;
import io.netty.channel.socket.InternetProtocolFamily;
import io.netty.channel.socket.nio.NioDatagramChannel;

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.NetworkInterface;
import java.net.SocketException;

public class SimpleMulticastClient {
public static void main(String[] args) throws InterruptedException, SocketException {
String groupAddress = args[0];
int groupPort = Integer.parseInt(args[1]);
String interfaceName = args[2];

Bootstrap b = new Bootstrap();
b.option(ChannelOption.SO_RCVBUF, 1048576);
b.group(new NioEventLoopGroup())
.handler(new SimpleChannelInboundHandler() {
@Override
public void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) {
System.out.println("Received: " + msg);
}
})
.option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(1000))
.option(ChannelOption.SO_REUSEADDR, Boolean.TRUE);

NetworkInterface networkInterface = NetworkInterface.getByName(interfaceName);
DatagramChannel channel = (DatagramChannel)b
.channelFactory(() -> new NioDatagramChannel(InternetProtocolFamily.IPv4))
.localAddress(0)
.bind(groupPort).sync().channel();
System.out.println("UDP client bound to: " + channel.localAddress());
channel.joinGroup(new InetSocketAddress(groupAddress, groupPort), networkInterface).sync();
}
}
Если я запускаю один клиент, я могу получать многоадресный трафик, ОК:

Код: Выделить всё

UDP client bound to: /0.0.0.0:19000
Received: DatagramPacket(/192.168.0.4:57335 => /0.0.0.0:19000, PooledUnsafeDirectByteBuf(ridx: 0, widx: 4, cap: 1000))
Received: DatagramPacket(/192.168.0.4:57335 => /0.0.0.0:19000, PooledUnsafeDirectByteBuf(ridx: 0, widx: 4, cap: 1000))
...
Если я попытаюсь запустить второй клиент на той же машине (с теми же аргументами), я получу следующее исключение:

Код: Выделить всё

Exception in thread "main" java.net.BindException: Address already in use
Я также пытался изменить эту строку:

Код: Выделить всё

    .bind(groupPort).sync().channel();
к:

Код: Выделить всё

    .bind(0).sync().channel();
и это позволяет запускать оба клиента одновременно (т. е. без конфликта портов). Однако затем клиенты перестают видеть многоадресный трафик.
Есть ли способ заставить это работать с Netty?

Подробнее здесь: https://stackoverflow.com/questions/778 ... cast-group
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»