Проблема с запуском этих клиентов на одном компьютере заключается в том, что каждый клиент привязан к одному и тому же порту. (групповой порт), что приводит к конфликту портов.
Как правило, можно запускать несколько клиентов, прослушивающих один и тот же адрес, так как этого можно добиться с помощью 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
Мобильная версия