子类 Netty Channel 或使用现有的

Subclass Netty Channel or use existing

我们越来越依赖 Netty,直到最近才开始依赖 PureJavaCommChannel,这是一个建立在 PureJavaComm 之上的 OioChannel 实现,它进一步建立在 JTermios 之上。 JTermios 是 Posix C 库的 JNA 包装器。

需要更多地控制串行端口的配置和性能,我们最近需要删除 PureJavaComm 层并直接使用 JTermios。

通过 posix read/write 调用将数据传入和传出通道实​​现 sourced/sunk 的最佳方式是什么?我应该 subclass 抽象通道类型之一还是使用现有的具体通道之一?为此,我目前正在使用 EmbededChannels 作为一种双向队列,但我的直觉是,这有点误用 class。想法?

最后听起来您最好实施您的自定义 "transport"。在最简单的情况下,这将是 AbstractChannel 的子 class 和与之一起使用的 EventLoop / EventLoopGroup 实现。

那么让这成为一个简单的 Oio 频道的例子。

public class StreamChannel extends OioByteStreamChannel {
    private final AtomicBoolean isInputShutdown = new AtomicBoolean(false);
    private final AtomicBoolean isOpen = new AtomicBoolean(true);

    private final InputStream input;
    private final OutputStream output;

    public StreamChannel(InputStream input, OutputStream output) {
        super(null);
        this.input = input;
        this.output = output;
    }

    @Override
    public boolean isOpen() {
        return isOpen.get();
    }

    @Override
    protected boolean isInputShutdown() {
        return isInputShutdown.get();
    }

    @Override
    protected ChannelFuture shutdownInput() {
        isInputShutdown.set(true);
        return this.newSucceededFuture();
    }

    @Override
    protected void doConnect(SocketAddress otherUnused, SocketAddress unused) throws Exception {
        activate(input, output);
    }

    @Override
    protected void doDisconnect() throws Exception {
        isOpen.set(false);
    }

    @Override
    protected void doBind(SocketAddress unused) throws Exception {
        throw new UnsupportedOperationException();
    }

    @Override
    protected SocketAddress localAddress0() {
        return null;
    }

    @Override
    protected SocketAddress remoteAddress0() {
        return null;
    }

    @Override
    public ChannelConfig config() {
        return new DefaultChannelConfig(this);
    }
}