在Linux中使用Java Netty组播发布数据包不起作用

问题描述

我正在Netty中编写一个多播发件人。我在Linux中使用'ngrep'嗅探了端口,但是我看不到数据包...我检查了示例并检查了代码,但是我不明白为什么它不起作用。您有什么想法,我的代码有什么问题吗?
谢谢

以下是我的代码

发布者

public class Publisher implements Runnable {
  private InetSocketAddress groupAddress;
  private NioDatagramChannel ch;
  private AtomicLong sequenceNumber = new AtomicLong(1);

  public Publisher(InetSocketAddress address) throws InterruptedException {
    groupAddress = address;
  }

  @Override
  public void run() {
    EventLoopGroup group = new NioEventLoopGroup();
    try {
      NetworkInterface ni = NetworkInterface.getByName("wlp3s0");
      Enumeration<InetAddress> addresses = ni.getInetAddresses();
      InetAddress localAddress = null;
      while (addresses.hasMoreElements()) {
        InetAddress address = addresses.nextElement();
        if (address instanceof Inet4Address) {
          localAddress = address;
        }
      }

      Bootstrap b =
          new Bootstrap().group(group).channelFactory(new ChannelFactory<NioDatagramChannel>() {
            @Override
            public NioDatagramChannel newChannel() {
              return new NioDatagramChannel(InternetProtocolFamily.IPv4);
            }
          })
          .handler(new LoggingHandler(LogLevel.DEBUG))
          .localAddress(localAddress,groupAddress.getPort())
              .option(ChannelOption.IP_MULTICAST_IF,ni)
              .option(ChannelOption.so_REUSEADDR,true)
              .handler(new MessageEncoder(groupAddress));

      ch = (NioDatagramChannel) b.bind(groupAddress.getPort()).sync().channel();
      ch.joinGroup(groupAddress,ni).sync();
      ch.closeFuture().await();
    } catch (InterruptedException e) {
      e.printstacktrace();
    } catch (SocketException e) {
      e.printstacktrace();
    } finally {
      group.shutdownGracefully();
    }
  }

  public void publish(List<Message> messages) throws Exception {
    ByteBuffer buffer = Packet.build(sequenceNumber.longValue(),messages);
    if (buffer != null)
      ch.writeAndFlush(buffer.array());
  }
}

MessageEncoder

public class MessageEncoder extends MessagetoMessageEncoder<Message> {

  private final InetSocketAddress remoteAddress;

  public MessageEncoder(InetSocketAddress remoteAddress) {
    this.remoteAddress = remoteAddress;
    }
  
  @Override
  protected void encode(ChannelHandlerContext ctx,Message msg,List<Object> out) throws Exception {
    ByteBuffer b = msg.encode();
    ByteBuf buffer = ctx.alloc().buffer(b.array().length);
    out.add(new DatagramPacket(buffer,remoteAddress));
  }

}

主要

public class Main {
  public static void main(String[] args) {
    
    ItchPublisher publisher = null;
    try {
      ExecutorService executorService = Executors.newFixedThreadPool(10);
      publisher = new ItchPublisher(new InetSocketAddress("233.113.216.52",21102));
      executorService.submit(publisher);
    } catch (InterruptedException e1) {
      // Todo Auto-generated catch block
      e1.printstacktrace();
      return;
    }
}

嗅探

$ sudo ngrep -d any port 21102

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...