Java: São possíveis leituras e gravações simultâneas em um SocketChannel de bloqueio por meio de putStreams (In | Out)?
Eu criei umObjectInputSteam
eObjectOutputStream
em um bloqueioSocketChannel
e estou tentando ler e escrever simultaneamente. Meu código é algo assim:
socketChannel = SocketChannel.open(destNode);
objectOutputStream = new ObjectOutputStream(Channels.newOutputStream(socketChannel));
objectInputStream = new ObjectInputStream(Channels.newInputStream(socketChannel));
Thread replyThread = new Thread("SendRunnable-ReplyThread") {
@Override
public void run() {
try {
byte reply = objectInputStream.readByte();//(A)
//..process reply
} catch (Throwable e) {
logger.warn("Problem reading receive reply.", e);
}
}
};
replyThread.start();
objectOutputStream.writeObject(someObject);//(B)
//..more writing
Problema é a gravação em blocos de linha (B) até que a leitura na linha (A) seja concluída (blocos no objeto retornado porSelectableChannel#blockingLock()
). Mas a lógica do aplicativo determina que a leitura não será concluída até que todas as gravações sejam concluídas, portanto, temos um bloqueio efetivo.
SocketChannel
Os javadocs dizem que as leituras e gravações simultâneas são suportadas.
Não tive esse problema quando tentei uma solução de soquete comum:
Socket socket = new Socket();
socket.connect(destNode);
final OutputStream outputStream = socket.getOutputStream();
objectOutputStream = new ObjectOutputStream(outputStream);
objectInputStream = new ObjectInputStream(socket.getInputStream());
No entanto, não posso aproveitar os benefícios de desempenho deFileChannel#transferTo(...)