Я пишу небольшую программу 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
. Благодарю.
Спасибо за ваш ответ. Я написал сервер, чтобы прослушать файл выше. Я обновил свой вопрос выше с помощью кодов сервера, который по-прежнему использует Netty. Благодарю. –
Выглядит правильно с первого взгляда. Я предполагаю, что входной сигнал равен «/tmp/test.sock». Можете ли вы проверить вывод «netstat», который я написал ранее? –
Спасибо Zbynek. Я узнал, что проблема синхронизации связана с тем, что клиент подключается к сокету раньше, чем запускает сервер. Я использовал некоторые защелки, чтобы синхронизировать их, и теперь это работает. Спасибо за советы по проверке сокета. Кроме того, мне нужно изменить «ChannelInitializer» с типом 'UnixChannel', чтобы он работал, поскольку при соединении с клиентом было ClassCastException. –