java整合upd包的问题

gz5pxeao  于 2021-07-09  发布在  Java
关注(0)|答案(0)|浏览(345)

希望有人能给我一些指导来解决我的问题。我不是很精通网络概念(我会的,但现在我才刚刚开始:))。
只是为了一点背景。我正试图从一个java应用程序中使用netflow。我有一个防火墙,它通过端口2055向我的机器发送netflow udp包。我连接到vpn,所以我有一个ip地址分配给它。我在ubuntu中工作,所以检查ifconfig可以看到接收这些包的接口。

一切都很好,直到这一点,我确信软件包是来了,因为我以前检查过wireshark(实际上我是用graylog看到这些内容)。

这就是问题所在,我使用netty就是为了这个目的,所以我有一个非常原始的实现来开始获取这些消息。

  1. import io.netty.bootstrap.Bootstrap;
  2. import io.netty.channel.*;
  3. import io.netty.channel.epoll.EpollEventLoopGroup;
  4. import io.netty.channel.epoll.EpollSocketChannel;
  5. import io.netty.channel.socket.SocketChannel;
  6. import org.springframework.stereotype.Service;
  7. import javax.annotation.PostConstruct;
  8. @Service
  9. public class DefaultNettyCollector {
  10. int port = 2055;
  11. Channel channel;
  12. EventLoopGroup workGroup = new EpollEventLoopGroup(1);
  13. public ChannelFuture connectLoop() throws Exception {
  14. try{
  15. Bootstrap b = new Bootstrap();
  16. b.group(workGroup);
  17. b.channel(EpollSocketChannel.class);
  18. b.option(ChannelOption.SO_KEEPALIVE, true);
  19. b.handler(new ChannelInitializer<SocketChannel>() {
  20. protected void initChannel(SocketChannel socketChannel) throws Exception {
  21. socketChannel.pipeline().addLast(new NettyHandler());
  22. }
  23. });
  24. ChannelFuture channelFuture = b.connect("172.16.*.*", this.port).sync();
  25. this.channel = channelFuture.channel();
  26. return channelFuture;
  27. }finally{
  28. }
  29. }
  30. }

我得到一个例外:

  1. io.netty.channel.AbstractChannel$AnnotatedConnectException: finishConnect(..) failed: Connection refused: /172.16.*.*:2055
  2. Caused by: java.net.ConnectException: finishConnect(..) failed: Connection refused
  3. at io.netty.channel.unix.Errors.throwConnectException(Errors.java:124)
  4. at io.netty.channel.unix.Socket.finishConnect(Socket.java:243)
  5. at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.doFinishConnect(AbstractEpollChannel.java:672)
  6. at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.finishConnect(AbstractEpollChannel.java:649)
  7. at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.epollOutReady(AbstractEpollChannel.java:529)
  8. at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:465)
  9. at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378)
  10. at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
  11. at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
  12. at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
  13. at java.base/java.lang.Thread.run(Thread.java:834)

好吧,澄清一下:
图片中的ip地址和代码是模糊的,我想我不应该这样做,但它只是为了张贴在这里的问题,我猜这是一个私人ip地址,但它是从我的公司,所以我宁愿不分享这样的信息。重要的是,我的代码中的ip地址与接口tun0分配的ip地址相同。
我用相同端口的其他ip地址测试了我的代码,包括0.0.0.0和127.0.0.1。同样的例外。
我用tcp端口测试了相同的代码,它成功了。我开始从我的机器中用netcat创建的服务器发送消息。我能收到信息。
代码中的nettyhandler类如下所示:

  1. import io.netty.buffer.ByteBuf;
  2. import io.netty.channel.ChannelHandlerContext;
  3. import io.netty.channel.ChannelInboundHandlerAdapter;
  4. import java.nio.charset.Charset;
  5. public class NettyHandler extends ChannelInboundHandlerAdapter {
  6. @Override
  7. public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
  8. super.channelReadComplete(ctx);
  9. }
  10. @Override
  11. public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
  12. ByteBuf byteBuf = (ByteBuf) msg;
  13. String message = byteBuf.toString(Charset.defaultCharset());
  14. System.out.println("Received Message : " + message);
  15. }
  16. @Override
  17. public void channelActive(ChannelHandlerContext ctx) throws Exception {
  18. super.channelActive(ctx);
  19. }
  20. }

我甚至尝试用这个处理程序创建更专门的udp消息

  1. import io.netty.channel.ChannelHandlerContext;
  2. import io.netty.channel.SimpleChannelInboundHandler;
  3. import io.netty.channel.socket.DatagramPacket;
  4. public abstract class DefaultUdpMessageHandler<T> extends SimpleChannelInboundHandler<DatagramPacket> {
  5. @Override
  6. protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception {
  7. System.out.println(msg.content());
  8. }
  9. }

这是我一直在尝试的。希望这只是我的网络概念的一个缺乏,你可以给我什么其他东西可以检查一些指导。
谢谢

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题