Я создал ObjectInputSteam
и ObjectOutputStream
для блокировки SocketChannel
и пытаюсь читать и писать одновременно. Мой код примерно такой:
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
Проблема заключается в блоках записи в строке (B) до тех пор, пока не завершится чтение в строке (A) (блоки в объекте, возвращенные SelectableChannel#blockingLock()
). Но логика приложения диктует, что чтение не будет завершено, пока не завершатся все записи, поэтому у нас есть эффективная тупиковая ситуация.
SocketChannel
Javadocs говорит, что одновременное чтение и запись поддерживаются.
У меня не было такой проблемы, когда я пробовал обычное решение Socket:
Socket socket = new Socket();
socket.connect(destNode);
final OutputStream outputStream = socket.getOutputStream();
objectOutputStream = new ObjectOutputStream(outputStream);
objectInputStream = new ObjectInputStream(socket.getInputStream());
Однако тогда я не смогу воспользоваться преимуществами производительности FileChannel#transferTo(...)