java整合upd包的问题

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

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

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

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

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.*;
import io.netty.channel.epoll.EpollEventLoopGroup;
import io.netty.channel.epoll.EpollSocketChannel;
import io.netty.channel.socket.SocketChannel;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

@Service
public class DefaultNettyCollector {

    int port = 2055;
    Channel channel;
    EventLoopGroup workGroup = new EpollEventLoopGroup(1);

    public ChannelFuture connectLoop() throws Exception {
        try{
            Bootstrap b = new Bootstrap();
            b.group(workGroup);
            b.channel(EpollSocketChannel.class);
            b.option(ChannelOption.SO_KEEPALIVE, true);
            b.handler(new ChannelInitializer<SocketChannel>() {
                protected void initChannel(SocketChannel socketChannel) throws Exception {
                    socketChannel.pipeline().addLast(new NettyHandler());
                }
            });
            ChannelFuture channelFuture = b.connect("172.16.*.*", this.port).sync();
            this.channel = channelFuture.channel();

            return channelFuture;
        }finally{
        }
    }

}

我得到一个例外:

io.netty.channel.AbstractChannel$AnnotatedConnectException: finishConnect(..) failed: Connection refused: /172.16.*.*:2055
Caused by: java.net.ConnectException: finishConnect(..) failed: Connection refused
    at io.netty.channel.unix.Errors.throwConnectException(Errors.java:124)
    at io.netty.channel.unix.Socket.finishConnect(Socket.java:243)
    at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.doFinishConnect(AbstractEpollChannel.java:672)
    at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.finishConnect(AbstractEpollChannel.java:649)
    at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.epollOutReady(AbstractEpollChannel.java:529)
    at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:465)
    at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    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类如下所示:

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.nio.charset.Charset;

public class NettyHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        super.channelReadComplete(ctx);
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf byteBuf = (ByteBuf) msg;
        String message = byteBuf.toString(Charset.defaultCharset());
        System.out.println("Received Message : " + message);
    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        super.channelActive(ctx);
    }
}

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

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.socket.DatagramPacket;

public abstract class DefaultUdpMessageHandler<T> extends SimpleChannelInboundHandler<DatagramPacket> {

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception {
        System.out.println(msg.content());
    }

}

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

暂无答案!

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

相关问题