Я реализовал сетевой сервер, работающий с клиентом, написанным в java. Проблема в том, что у меня есть проблема конфигурации конвейера, потому что у меня есть следующее сообщение: «достигнуто в хвосте конвейера. Проверьте конфигурацию вашего трубопровода». Я пробовал ответы на другие вопросы одного типа, но это не работает. У вас есть идея, как решить проблему? Вот мой инициализации моего сервера:Конфигурация сетей нетти
public class NettyServerInitializer extends ChannelInitializer<SocketChannel> {
private final SslContext sslCtx;
public NettyServerInitializer(SslContext sslCtx) {
this.sslCtx = sslCtx;
}
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
if (sslCtx != null) {
p.addLast(sslCtx.newHandler(ch.alloc()));
}
p.addLast(
new StringEncoder(CharsetUtil.UTF_8),
new LineBasedFrameDecoder(8192),
new StringDecoder(CharsetUtil.UTF_8),
new ChunkedWriteHandler(),
new NettyServerHandler());
p.addLast(new HttpRequestDecoder());
p.addLast(new HttpResponseEncoder());
// Remove the following line if you don't want automatic content compression.
p.addLast(new HttpContentCompressor());
p.addLast("http-aggregator", new HttpObjectAggregator(1024));
}
}
и мой код сервера:
public static void main(String... args) {
try {
new NettyServer().start();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("API started on port {}", PORT);
}
} catch (final Exception e) {
LOGGER.error("Unable to start API server", e);
}
}
static final boolean SSL = System.getProperty("ssl") != null;
// Use the same default port with the telnet example so that we can use the telnet client example to access it.
static final int PORT = Integer.parseInt(System.getProperty("port", SSL? "8992" : "8080"));
public void start() throws Exception {
// Configure SSL.
final SslContext sslCtx;
if (SSL) {
SelfSignedCertificate ssc = new SelfSignedCertificate();
sslCtx = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey()).build();
} else {
sslCtx = null;
}
// Configure the server.
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
// try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 100)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new NettyServerInitializer(sslCtx) {
});
// Start the server.
ChannelFuture f = b.bind(PORT).sync();
// Wait until the server socket is closed.
// f.channel().closeFuture().sync();
/* } finally {
// Shut down all event loops to terminate all threads.
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}*/
}
Спасибо за ваш ответ. Я удалил три строки –
Но проблема всегда присутствует. –
Вам также нужно что-то в хвосте вашего конвейера для обработки входящих HTTP-запросов. Это то, что должен делать ваш «NettyServerHandler»? Попробуйте переместить его, чтобы он был добавлен последним. –