खोज…


टिप्पणियों

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 का प्रदर्शन थ्रेड पूल या किसी अन्य जगह पर किया जा सकता है। इससे जुड़े क्लाइंट की संख्या के लिए एक एप्लिकेशन को आसानी से स्केल करने की अनुमति मिलती है।

निम्नलिखित उदाहरण मूल बातें दिखाता है:

  1. एक Selector बनाएँ
  2. एक SocketChannel बनाएँ
  3. Selector को SocketChannel पंजीकृत करें
  4. घटनाओं का पता लगाने के लिए 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


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow