子类别Netty Channel或使用现有的

时间:2018-12-21 01:45:50

标签: serial-port netty

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

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

通过posix读/写调用将数据往返于通道实现的最佳方法是什么?我应该继承一种抽象渠道类型还是使用现有的具体渠道之一?我目前正在为此目的使用EmbededChannels作为一种双向队列,但我的直觉是这有点滥用该类。有想法吗?

2 个答案:

答案 0 :(得分:1)

最后,听起来您最好实现自定义的“运输”。在最简单的情况下,这将是AbstractChannel的子类和与其配合使用的EventLoop / EventLoopGroup实现。

答案 1 :(得分:0)

接下来,让我们以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);
    }
}