Java Language
एनआईओ - नेटवर्किंग
खोज…
टिप्पणियों
SelectionKey
अपने चयनकर्ता और चैनल के बीच विभिन्न चयन योग्य संचालन और सूचनाओं को परिभाषित करता है। विशेष रूप से, अनुलग्नक का उपयोग कनेक्शन-संबंधित जानकारी को संग्रहीत करने के लिए किया जा सकता है।
OP_READ
को OP_READ
करना बहुत सीधा-सीधा है। हालांकि, OP_WRITE
से निपटने के OP_WRITE
सावधानी बरती जानी चाहिए: अधिकांश समय, डेटा सॉकेट्स को लिखा जा सकता है, इसलिए घटना फायरिंग होती रहेगी। डेटा लिखने से पहले केवल OP_WRITE
पंजीकृत करना सुनिश्चित करें ( उस उत्तर को देखें)।
इसके अलावा, OP_CONNECT
एक बार चैनल जुड़ा हुआ है (क्योंकि, ठीक है, यह जुड़ा हुआ है। देखें रद्द किया जाना चाहिए इस और है कि इतने पर जवाब)। इसलिए OP_CONNECT
बाद OP_CONNECT
निष्कासन finishConnect()
सफल रहा।
घटनाओं का इंतजार करने के लिए चयनकर्ता का उपयोग करना (उदाहरण के लिए OP_CONNECT)
NIO जावा 1.4 में दिखाई दिया और "चैनल" की अवधारणा को पेश किया, जो कि नियमित I / O से तेज माना जाता है। नेटवर्क-वार, SelectableChannel
सबसे दिलचस्प है क्योंकि यह चैनल के विभिन्न राज्यों की निगरानी करने की अनुमति देता है। यह एक समान तरीके से काम करता है जैसे कि सी select()
सिस्टम कॉल: कुछ प्रकार की घटनाओं के होने पर हम जाग जाते हैं:
- कनेक्शन प्राप्त हुआ (
OP_ACCEPT
) - कनेक्शन का एहसास हुआ (
OP_CONNECT
) - डेटा पढ़ें FIFO (
OP_READ
) में उपलब्ध - डेटा को FIFO (
OP_WRITE
) लिखने के लिए धकेला जा सकता है
यह सॉकेट आई / ओ (कुछ पढ़ा जा सकता है / लिखा / ...) का पता लगाने और प्रदर्शन कर आई / ओ के बीच अलगाव के लिए अनुमति देता है (पठन / लेखन / ...)। विशेष रूप से, सभी I / O का पता लगाने का कार्य एक ही थ्रेड में कई सॉकेट (क्लाइंट) के लिए किया जा सकता है, जबकि I / O का प्रदर्शन थ्रेड पूल या किसी अन्य जगह पर किया जा सकता है। इससे जुड़े क्लाइंट की संख्या के लिए एक एप्लिकेशन को आसानी से स्केल करने की अनुमति मिलती है।
निम्नलिखित उदाहरण मूल बातें दिखाता है:
- एक
Selector
बनाएँ - एक
SocketChannel
बनाएँ -
Selector
कोSocketChannel
पंजीकृत करें - घटनाओं का पता लगाने के लिए
Selector
साथ पाश
Selector sel = Selector.open(); // Create the Selector
SocketChannel sc = SocketChannel.open(); // Create a SocketChannel
sc.configureBlocking(false); // ... non blocking
sc.setOption(StandardSocketOptions.SO_KEEPALIVE, true); // ... set some options
// Register the Channel to the Selector for wake-up on CONNECT event and use some description as an attachement
sc.register(sel, SelectionKey.OP_CONNECT, "Connection to google.com"); // Returns a SelectionKey: the association between the SocketChannel and the Selector
System.out.println("Initiating connection");
if (sc.connect(new InetSocketAddress("www.google.com", 80)))
System.out.println("Connected"); // Connected right-away: nothing else to do
else {
boolean exit = false;
while (!exit) {
if (sel.select(100) == 0) // Did something happen on some registered Channels during the last 100ms?
continue; // No, wait some more
// Something happened...
Set<SelectionKey> keys = sel.selectedKeys(); // List of SelectionKeys on which some registered operation was triggered
for (SelectionKey k : keys) {
System.out.println("Checking "+k.attachment());
if (k.isConnectable()) { // CONNECT event
System.out.print("Connected through select() on "+k.channel()+" -> ");
if (sc.finishConnect()) { // Finish connection process
System.out.println("done!");
k.interestOps(k.interestOps() & ~SelectionKey.OP_CONNECT); // We are already connected: remove interest in CONNECT event
exit = true;
} else
System.out.println("unfinished...");
}
// TODO: else if (k.isReadable()) { ...
}
keys.clear(); // Have to clear the selected keys set once processed!
}
}
System.out.print("Disconnecting ... ");
sc.shutdownOutput(); // Initiate graceful disconnection
// TODO: emtpy receive buffer
sc.close();
System.out.println("done");
निम्नलिखित आउटपुट देंगे:
Initiating connection
Checking Connection to google.com
Connected through 'select()' on java.nio.channels.SocketChannel[connection-pending remote=www.google.com/216.58.208.228:80] -> done!
Disconnecting ... done