Java: Возможно ли одновременное чтение и запись в блокирующем SocketChannel через Object (In | Out) putStreams?
Я создал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(...)