Creé un ObjectInputSteam
y ObjectOutputStream
en un bloqueo SocketChannel
y estoy tratando de leer y escribir al mismo tiempo. Mi código es algo como esto:Java: ¿Son posibles las lecturas y escrituras simultáneas en un SocketChannel de bloqueo a través de Object (In | Out) putStreams?
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 es la introducción de información en línea (B) bloquea hasta que la lectura en la línea (A) completa (bloques en el objeto devuelto por SelectableChannel#blockingLock()
). Pero la lógica de la aplicación dicta que la lectura no se completará hasta que todas las escrituras se completen, por lo que tenemos un punto muerto efectivo.
SocketChannel
javadocs dicen que las lecturas y escrituras concurrentes son compatibles.
que no experimentaron ningún problema de este tipo cuando intenté una solución zócalo periódica:
Socket socket = new Socket();
socket.connect(destNode);
final OutputStream outputStream = socket.getOutputStream();
objectOutputStream = new ObjectOutputStream(outputStream);
objectInputStream = new ObjectInputStream(socket.getInputStream());
Sin embargo, entonces no puedo aprovechar las ventajas de rendimiento de FileChannel#transferTo(...)
He intentado cambiarlo para usar socketChannel.socket(). Get (Out | In) putStream, pero no hizo ninguna diferencia. El OutputStream parece ser del mismo tipo que antes: la clase interna anónima devuelta por Channels # newOutputStream (OutputStream). –
Es el InputStream que debería cambiar a una subclase (no probado). –
* comprueba bugster * http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=d76c6fabad9827be488fceb8d9f4?bug_id=4509080 Muchos errores, baja prioridad. Parece que estás obligado a comenzar con una vieja escuela java.net.Socket. –