希望有人能给我一些指导来解决我的问题。我不是很精通网络概念(我会的,但现在我才刚刚开始:))。
只是为了一点背景。我正试图从一个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());
}
}
这是我一直在尝试的。希望这只是我的网络概念的一个缺乏,你可以给我什么其他东西可以检查一些指导。
谢谢
暂无答案!
目前还没有任何答案,快来回答吧!