我们越来越依赖Netty,直到最近才依赖PureJavaCommChannel,它是在PureJavaComm之上构建的OioChannel实现,该实现进一步在JTermios之上构建。 JTermios是Posix C库的JNA包装器。
需要对串行端口的配置和性能进行更多控制,我们最近需要删除PureJavaComm层并直接使用JTermios。
通过posix读/写调用将数据往返于通道实现的最佳方法是什么?我应该继承一种抽象渠道类型还是使用现有的具体渠道之一?我目前正在为此目的使用EmbededChannels作为一种双向队列,但我的直觉是这有点滥用该类。有想法吗?
答案 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);
}
}