2015-10-23 3 views
2

Я пишу небольшую программу Java, которая использует Netty для подключения к соке домена unix для получения некоторой информации. Я использую Netty 4.0.32.Final и используя собственный пакет epoll. Вот самозагрузки код, который я написал:Не удалось подключиться к сокету unix домена

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) 

Могу ли я знаете, что что-то не так с настройкой бутстрапа? Благодарю.

Обновление Я написал простой сервер для проверки кода выше в модульном тесте. Вот коды сервера:

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. Благодарю.

ответ

0

Похоже, что ничто не слушает этот разъем. Вы запустили там какой-нибудь сервер? Вы можете проверить:

netstat -na | grep /tmp/test.sock 
+0

Спасибо за ваш ответ. Я написал сервер, чтобы прослушать файл выше. Я обновил свой вопрос выше с помощью кодов сервера, который по-прежнему использует Netty. Благодарю. –

+0

Выглядит правильно с первого взгляда. Я предполагаю, что входной сигнал равен «/tmp/test.sock». Можете ли вы проверить вывод «netstat», который я написал ранее? –

+0

Спасибо Zbynek. Я узнал, что проблема синхронизации связана с тем, что клиент подключается к сокету раньше, чем запускает сервер. Я использовал некоторые защелки, чтобы синхронизировать их, и теперь это работает. Спасибо за советы по проверке сокета. Кроме того, мне нужно изменить «ChannelInitializer» с типом 'UnixChannel', чтобы он работал, поскольку при соединении с клиентом было ClassCastException. –