Определить закрытие соединения канала в ChannelGroup - PullRequest
1 голос
/ 08 апреля 2019

согласно этому коду (из примера netty), я хочу реализовать систему присутствия. поэтому мне нужно определить, когда потеряно соединение с клиентом (например, из-за завершения интернет-связки клиента)

public class SecureChatServerHandler extends SimpleChannelInboundHandler<String> {

    static final ChannelGroup channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

    @Override
    public void channelActive(final ChannelHandlerContext ctx) {
        ctx.pipeline().get(SslHandler.class).handshakeFuture().addListener(
                new GenericFutureListener<Future<Channel>>() {
                    @Override
                    public void operationComplete(Future<Channel> future) throws Exception {
                        ctx.writeAndFlush(
                                "Welcome to " + InetAddress.getLocalHost().getHostName() + " secure chat service!\n");
                        ctx.writeAndFlush(
                                "Your session is protected by " +
                                        ctx.pipeline().get(SslHandler.class).engine().getSession().getCipherSuite() +
                                        " cipher suite.\n");

                        channels.add(ctx.channel());
                    }
        });
    }

    @Override
    public void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
        // Send the received message to all channels but the current one.
        for (Channel c: channels) {
            if (c != ctx.channel()) {
                c.writeAndFlush("[" + ctx.channel().remoteAddress() + "] " + msg + '\n');
            } else {
                c.writeAndFlush("[you] " + msg + '\n');
            }
        }

        // Close the connection if the client has sent 'bye'.
        if ("bye".equals(msg.toLowerCase())) {
            ctx.close();
        }
    }

    ---
}

как уведомить группу каналов, когда канал закрыт?

пример источника: https://netty.io/4.1/xref/io/netty/example/securechat/SecureChatServerHandler.html

1 Ответ

1 голос
/ 09 апреля 2019

Одним из способов решения этой проблемы является использование функции channelInactive внутри обработчика.

Эта функция вызывается, когда канал закрыт из-за успешного закрытия или сетевой ошибки.

@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
    // Send the received message to all channels but the current one.
    for (Channel c: channels) {
        if (c != ctx.channel()) {
            c.writeAndFlush("[" + ctx.channel().remoteAddress() + "] has left the chat\n");
        }
    }
}
...