Как бы вы продлили канал? - PullRequest
1 голос
/ 15 января 2012

Мне нужна небольшая помощь с Нетти.Мне было интересно, как бы вы расширили интерфейс Channel, добавили к нему мои собственные методы и заставили Netty использовать его (или привести к нему)?

Matt.

Ответы [ 2 ]

1 голос
/ 19 августа 2018

Ответ актуален для netty 4.1.25.Final.

Сначала расширьте тип вашего канала

public class ExtendedNioChannel extends NioSocketChannel implements Channel {
    private volatile boolean handshakeComplete;
    // more custom fields and methods
}

Если вы хотите использовать его для начальной загрузки клиента, просто передайте ему этот класс.

 Bootstrap b = new Bootstrap();
                b.group(workerGroup);
                b.channel(ExtendedNioChannel.class);

Для начальной загрузки сервера необходимо переопределить NioServerSocketChannel и передать NioServerSocketChannel.class в ServerBootstrap.

public class ExtendedNioServerChannel extends NioServerSocketChannel {
    private static final InternalLogger logger = InternalLoggerFactory.getInstance(NioServerSocketChannel.class);

    @Override
    protected int doReadMessages(List<Object> buf) throws Exception {
        SocketChannel ch = SocketUtils.accept(javaChannel());

        try {
            if (ch != null) {
                buf.add(new ExtendedNioChannel(this, ch));
                return 1;
            }
        } catch (Throwable t) {
            logger.warn("Failed to create a new channel from an accepted socket.", t);

            try {
                ch.close();
            } catch (Throwable t2) {
                logger.warn("Failed to close a socket.", t2);
            }
        }

        return 0;
    }
}

 ServerBootstrap b = new ServerBootstrap();
            b.group(acceptGroup, workerGroup)
                    .channel(BtcNioServerChannel.class)
0 голосов
/ 15 января 2012

Я полагаю, что лучшим решением было бы "обернуть" канал в хранилище классов в классе ChannelLocal или в ChannelHandlerContext.Затем jsut извлекает вашу реализацию и использует ее.Это позволит вам переключаться между NIO и OIO без необходимости беспокоиться о реализации.

Я делаю нечто подобное в niosmtp: https://github.com/normanmaurer/niosmtp/blob/master/src/main/java/me/normanmaurer/niosmtp/transport/netty/NettySMTPClientSession.java

Это также помогает вам удвоить вашиcode.

Чтобы предоставить собственный канал, вам нужно взломать реализацию сокета.Но, как я думаю, вы должны избегать этого всякий раз, когда это возможно.

...