Bir SocketChannel
engelleme üzerinde bir ObjectInputSteam
ve ObjectOutputStream
oluşturdu ve aynı anda okuma ve yazma çalışıyorum. (SelectableChannel#blockingLock()
tarafından döndürülen nesne üzerinde bloklar)Java: Object (In | Out) putStreams ile bir blok SocketChannel üzerinde eşzamanlı okuma ve yazma mümkün mü?
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
Sorun hattı (B) 'deki yazma olduğu bloklar okuma kadar hattı (A)' da tamamlar: My kod aşağıdaki gibi bir şeydir. Ancak uygulama mantığı, tüm yazımlar tamamlanıncaya kadar okunmanın tamamlanmayacağını, dolayısıyla etkin bir çıkmaza sahip olduğumuzu belirtir. Eşzamanlı okuma ve yazmaların desteklendiğini söyleyen javadocs, javadocs derler. Eğer aynı anda InputStream ve OutputStream kullanmak istiyorsanız Ancak, o zaman ben FileChannel#transferTo(...)
socketChannel.socket(). Get (Out | In) putStream kullanmak için değiştirmeyi denedim, ancak fark yaratmadı. OutputStream daha önce olduğu gibi aynı türden görünüyor: Kanallar # newOutputStream (OutputStream) tarafından döndürülen anonim bir iç sınıf. –
Bir alt sınıfa (test edilmemiş) geçiş yapması gereken InputStream. –
* bugster denetler * http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=d76c6fabad9827be488fceb8d9f4?bug_id=4509080 Çok sayıda hata, düşük öncelikli. Eski bir okul java.net.Socket ile başlamak zorunda kalıyor gibi görünüyor. –