मैंने और ObjectOutputStream
को अवरुद्ध SocketChannel
पर बनाया और समवर्ती रूप से पढ़ने और लिखने की कोशिश कर रहा हूं। (ब्लॉक वस्तु SelectableChannel#blockingLock()
द्वारा दिया पर) लाइन (ए) में ब्लॉकजावा: ऑब्जेक्ट (इन | आउट) 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
समस्या लाइन (बी) पर लिखने है पढ़ने जब तक पूरे करता है: मेरे कोड कुछ इस तरह है। लेकिन ऐप तर्क यह निर्देश देता है कि जब तक सभी लिखने को पूरा नहीं किया जाता है, तो हमारे पास एक प्रभावी डेडलॉक होता है।
SocketChannel
javadocs का कहना है कि समवर्ती पढ़ने और लिखने का समर्थन किया जाता है।
मैं ऐसी कोई समस्या का सामना करना है जब मैं एक नियमित रूप से सॉकेट समाधान की कोशिश की:
Socket socket = new Socket();
socket.connect(destNode);
final OutputStream outputStream = socket.getOutputStream();
objectOutputStream = new ObjectOutputStream(outputStream);
objectInputStream = new ObjectInputStream(socket.getInputStream());
हालांकि, तो मैं नहीं लाभ FileChannel#transferTo(...)
मैंने इसे सॉकेटChannel.socket() का उपयोग करने के लिए बदलने की कोशिश की। (आउट | इन) putStream प्राप्त करें, लेकिन इससे कोई फर्क नहीं पड़ता। आउटपुटस्ट्रीम पहले जैसा ही प्रतीत होता है: अज्ञात आंतरिक वर्ग चैनल # newOutputStream (आउटपुटस्ट्रीम) द्वारा लौटाया जाता है। –
यह इनपुटस्ट्रीम है जो उप-वर्ग (परीक्षण नहीं किया गया) में बदलना चाहिए। –
* चेक बगस्टर * http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=d76c6fabad9827be488fceb8d9f4?bug_id=4509080 बहुत सारी बग, कम प्राथमिकता। ऐसा लगता है कि आपको पुराने स्कूल java.net सॉकेट से शुरू करने के लिए मजबूर होना पड़ता है। –