我正在编写一个小的Java程序,使用Netty连接到Unix域套接字以检索一些信息。我使用的是Netty 4.0.32.Final
版本,并使用本机epoll包。以下是我编写的引导代码:
final Bootstrap bootstrap = new Bootstrap();
bootstrap
.group(new EpollEventLoopGroup())
.channel(EpollDomainSocketChannel.class)
.handler(
new ChannelInitializer<DomainSocketChannel>() {
@Override
protected void initChannel(
final DomainSocketChannel channel) throws Exception {
channel.pipeline().addLast(
new ChannelInboundHandlerAdapter() {
@Override
public void channelRead(
final ChannelHandlerContext ctx,
final Object msg) throws Exception {
final ByteBuf buff = (ByteBuf) msg;
try {
buff.readBytes(
DomainSocket.this.out,
buff.readableBytes()
);
} finally {
buff.release();
}
}
@Override
public void exceptionCaught(
final ChannelHandlerContext ctx,
final Throwable cause) throws Exception {
Logger.error(
"Error occur when reading from Unix domain socket: %s",
cause.getMessage()
);
ctx.close();
}
}
);
}
}
);
我认为这看起来很好,但是当我运行时
bootstrap.connect(new DomainSocketAddress("/tmp/test.sock"));
它总是抱怨以下错误:
java.net.ConnectException: connect() failed: Connection refused: /tmp/test.sock
at io.netty.channel.epoll.Native.newConnectException(Native.java:504)
at io.netty.channel.epoll.Native.connect(Native.java:481)
at io.netty.channel.epoll.AbstractEpollStreamChannel.doConnect(AbstractEpollStreamChannel.java:567)
at io.netty.channel.epoll.EpollDomainSocketChannel.doConnect(EpollDomainSocketChannel.java:81)
at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.connect(AbstractEpollStreamChannel.java:627)
at io.netty.channel.DefaultChannelPipeline$HeadContext.connect(DefaultChannelPipeline.java:1097)
请问Bootstrap的安装是否出了问题?谢谢。
更新 我编写了一个简单的服务器来测试上面代码的单元测试。以下是服务器代码:
final ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap
.group(new EpollEventLoopGroup(), new EpollEventLoopGroup())
.channel(EpollServerDomainSocketChannel.class)
.childHandler(
new ChannelInitializer<ServerDomainSocketChannel>() {
@Override
protected void initChannel(
final ServerDomainSocketChannel channel)
throws Exception {
channel.pipeline().addLast(
new ChannelInboundHandlerAdapter() {
@Override
public void channelActive(
final ChannelHandlerContext ctx)
throws Exception {
final ByteBuf buff = ctx.alloc().buffer();
buff.writeBytes("This is a test".getBytes());
ctx.writeAndFlush(buff)
.addListener(
ChannelFutureListener.CLOSE
);
}
}
);
}
}
);
final ChannelFuture future =
bootstrap.bind(new DomainSocketAddress(input)).sync();
future.channel().closeFuture().sync();
我使用ExecutorService
在单独的线程中启动了这个服务器代码。谢谢。
netstat
命令的输出吗? - Zbynek Vyskovsky - kvr000ChannelInitializer
的类型为UnixChannel
,以使其在客户端连接时不会出现ClassCastException。 - Jason Wong