Netty连接Unix域套接字失败。

4

我正在编写一个小的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在单独的线程中启动了这个服务器代码。谢谢。

1个回答

1

看起来该套接字上没有任何监听。您是否在那里运行了任何服务器进行监听?您能否检查:

netstat -na | grep /tmp/test.sock

谢谢您的回复。我已经编写了一个服务器来监听上面的文件。我已经更新了我的问题,其中包含服务器代码,仍然使用Netty。谢谢。 - Jason Wong
乍一看似乎没问题。 我假设输入等于“/tmp/test.sock”。 你能检查我之前编写的netstat命令的输出吗? - Zbynek Vyskovsky - kvr000
1
谢谢Zbynek。我发现这是一个同步问题,客户端连接到套接字比服务器启动早。我使用了一些闩锁来同步它们,现在它可以工作了。感谢您提供的验证套接字的提示。此外,我需要更改ChannelInitializer的类型为UnixChannel,以使其在客户端连接时不会出现ClassCastException。 - Jason Wong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接