亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

java NIO

AlphaWatch / 855人閱讀

摘要:是什么就不在此文展開,這篇主要來介紹下我們要怎樣通過來構(gòu)建一個(gè)服務(wù)客戶端程序的。的通信完全依賴與,數(shù)據(jù)的寫入和讀取都是通過從中寫入讀取。和上的調(diào)用一樣的功能,監(jiān)聽已經(jīng)注冊(cè)在上面的文件描述符,監(jiān)聽上的事件。

NIO是什么就不在此文展開,這篇主要來介紹下我們要怎樣通過java NIO來構(gòu)建一個(gè)服務(wù)客戶端程序的。

0x01 涉及知識(shí)點(diǎn)

NIO建立一個(gè)服務(wù)端和客戶端程序主要涉及的知識(shí)點(diǎn)有:

channel

selector

buffer

如果通過C/C++寫過通信程序的應(yīng)該知道都是通過linux提供的系統(tǒng)調(diào)用來完成,java NIO的實(shí)現(xiàn)思想上沒有什么變化只是在實(shí)現(xiàn)方式上換了一種新的概念,并提供了更友好的開發(fā)模式供開發(fā)人員更加簡便快捷的來實(shí)現(xiàn)自己想要的功能。

channel:NIO的通信完全依賴與channel,數(shù)據(jù)的寫入和讀取都是通過channel從buffer中寫入/讀取。

selector:和linux上的select調(diào)用一樣的功能,監(jiān)聽已經(jīng)注冊(cè)在上面的socket文件描述符,java NIO監(jiān)聽channel上的事件。主要有:OP_CONNECT()、OP_ACCEPT、OP_READ、OP_WRITE。

buffer主要是從channel中讀出數(shù)據(jù)或者寫入數(shù)據(jù)到channel。

0x02 server
public class NioServer {

    public static void main(String[] args) {
        try {
            // 建立一個(gè)serversocketchannel,用于監(jiān)聽是否有連接到來
            ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
            // 設(shè)置為非阻塞模式
            serverSocketChannel.configureBlocking(false);
            // 綁定監(jiān)聽的地址
            serverSocketChannel.bind(new InetSocketAddress(8080));
            // 獲取一個(gè)selector
            Selector selector = Selector.open();
            // 將channel注冊(cè)到selector中,并且這個(gè)channel關(guān)心的是accept事件
            serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

            while(true) {
                int readySize = selector.select();
                if(readySize == 0) {
                    continue;
                }
                // 獲取有事件到來的selectKeys
                Set selectionKeys = selector.selectedKeys();
                // 處理到來的事件
                for(Iterator iter = selectionKeys.iterator(); iter.hasNext(); ) {
                    SelectionKey selectionKey = iter.next();
                    // 要將已經(jīng)被處理的selectionKey刪除掉
                    iter.remove();
                    if(selectionKey.isAcceptable()) {
                        System.out.println("acceptable");
                        ServerSocketChannel listenChannel = (ServerSocketChannel) selectionKey.channel();
                        /* 獲取連接進(jìn)來的channel */
                        SocketChannel socketChannel = listenChannel.accept();
                        socketChannel.configureBlocking(false);
                        socketChannel.write(ByteBuffer.wrap(new String("java NIO").getBytes()));
                        socketChannel.register(selector, SelectionKey.OP_READ);
                    } else if(selectionKey.isReadable()) {
                        SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
                        ByteBuffer byteBuffer = ByteBuffer.allocate(100);
                        int readSize = socketChannel.read(byteBuffer);
                        /* 相應(yīng)的channel連接斷開了將其關(guān)閉掉 */
                        if(readSize == -1) {
                            socketChannel.close();
                            selectionKey.cancel();
                            continue;
                        }
                        /* 將客戶端寫入的數(shù)據(jù)顯示出來 */
                        byte[] bytes = byteBuffer.array();
                        String message = new String(bytes).trim();
                        System.out.println(message);
                    }
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }
}
0x03 client
public class NioClient {

    public static void main(String[] args) {
        SocketChannel socketChannel = null;
        try {
            socketChannel = SocketChannel.open();
            socketChannel.configureBlocking(false);
            // 發(fā)起連接請(qǐng)求
            socketChannel.connect(new InetSocketAddress("127.0.0.1", 8080));
            Selector selector = Selector.open();
            socketChannel.register(selector, SelectionKey.OP_CONNECT);
            while (true) {
                int readySize = selector.select();
                if(readySize == 0) {
                    continue;
                }
                Set selectionKeys =  selector.selectedKeys();
                for(SelectionKey selectionKey : selectionKeys) {
                    SocketChannel clientChannel = (SocketChannel)selectionKey.channel();
                    if(selectionKey.isConnectable()) {
                        /* 連接還沒建立完全,等待連接建立完成 */
                        if(clientChannel.isConnectionPending()) {
                            clientChannel.finishConnect();
                        }
                        clientChannel.register(selector, SelectionKey.OP_READ);
                    } else if (selectionKey.isReadable()) {
                        System.out.println("readable");
                        ByteBuffer byteBuffer = ByteBuffer.allocate(100);
                        System.out.println(clientChannel.read(byteBuffer));
                        byte[] bytes = byteBuffer.array();
                        String message = new String(bytes).trim();
                        System.out.println(message);
                    }
                    selectionKeys.remove(selectionKey);
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }
}
0x04 參考

NIO相關(guān)的概念可以點(diǎn)這里

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/66220.html

相關(guān)文章

  • Java NIO 系列教程

    摘要:異步可以讓你異步的使用,例如當(dāng)線程從通道讀取數(shù)據(jù)到緩沖區(qū)時(shí),線程還是可以進(jìn)行其他事情。當(dāng)數(shù)據(jù)被寫入到緩沖區(qū)時(shí),線程可以繼續(xù)處理它。因此,單個(gè)的線程可以監(jiān)聽多個(gè)數(shù)據(jù)通道。下面是系列文章的目錄概述通道之間的數(shù)據(jù)傳輸與原文譯者郭蕾校對(duì)方騰飛 Java NIO(New IO)是一個(gè)可以替代標(biāo)準(zhǔn)Java IO API的IO API(從Java 1.4開始),Java NIO提供了與標(biāo)準(zhǔn)IO不同的...

    fanux 評(píng)論0 收藏0
  • Java NIO 概覽

    摘要:線程之間的切換對(duì)于操作系統(tǒng)來說是昂貴的。因此,單線程可以監(jiān)視多個(gè)通道中的數(shù)據(jù)。當(dāng)方法返回后,線程可以處理這些事件。 一 NIO簡介 Java NIO 是 java 1.4 之后新出的一套IO接口,這里的的新是相對(duì)于原有標(biāo)準(zhǔn)的Java IO和Java Networking接口。NIO提供了一種完全不同的操作方式。 NIO中的N可以理解為Non-blocking,不單純是New。 它支持面...

    chemzqm 評(píng)論0 收藏0
  • 關(guān)于Java IO與NIO知識(shí)都在這里

    摘要:從通道進(jìn)行數(shù)據(jù)寫入創(chuàng)建一個(gè)緩沖區(qū),填充數(shù)據(jù),并要求通道寫入數(shù)據(jù)。三之通道主要內(nèi)容通道介紹通常來說中的所有都是從通道開始的。從中選擇選擇器維護(hù)注冊(cè)過的通道的集合,并且這種注冊(cè)關(guān)系都被封裝在當(dāng)中停止選擇的方法方法和方法。 由于內(nèi)容比較多,我下面放的一部分是我更新在我的微信公眾號(hào)上的鏈接,微信排版比較好看,更加利于閱讀。每一篇文章下面我都把文章的主要內(nèi)容給列出來了,便于大家學(xué)習(xí)與回顧。 Ja...

    Riddler 評(píng)論0 收藏0
  • Java NIO 的前生今世 之一 簡介

    摘要:簡介是由引進(jìn)的異步由以下幾個(gè)核心部分組成和的對(duì)比和的區(qū)別主要體現(xiàn)在三個(gè)方面基于流而基于操作是阻塞的而操作是非阻塞的沒有概念而有概念基于與基于傳統(tǒng)的是面向字節(jié)流或字符流的而在中我們拋棄了傳統(tǒng)的流而是引入了和的概念在中我只能從中讀取數(shù)據(jù)到中或?qū)? 簡介 Java NIO 是由 Java 1.4 引進(jìn)的異步 IO.Java NIO 由以下幾個(gè)核心部分組成: Channel Buffer Se...

    李義 評(píng)論0 收藏0
  • 動(dòng)力節(jié)點(diǎn)JavaNIO教程,輕松攻破Java NIO技術(shù)壁壘

    摘要:學(xué)習(xí)和掌握技術(shù)已經(jīng)不是一個(gè)攻城獅的加分技能,而是一個(gè)必備技能。是雙向的,不僅可以讀取數(shù)據(jù)還能保存數(shù)據(jù),程序不能直接讀寫通道,只與緩沖區(qū)交互為了讓大家不被高并發(fā)與大量連接處理問題所困擾,動(dòng)力節(jié)點(diǎn)推出了高效處理模型應(yīng)用教程。 大家肯定了解Java IO, 但是對(duì)于NIO一般是陌生的,而現(xiàn)在使用到NIO的場景越來越多,很多技術(shù)框...

    ralap 評(píng)論0 收藏0
  • Netty序章之BIO NIO AIO演變

    摘要:后改良為用線程池的方式代替新增線程,被稱為偽異步。最大的問題是阻塞,同步。每次請(qǐng)求都由程序執(zhí)行并返回,這是同步的缺陷。這些都會(huì)被注冊(cè)在多路復(fù)用器上。多路復(fù)用器提供選擇已經(jīng)就緒狀態(tài)任務(wù)的能力。并沒有采用的多路復(fù)用器,而是使用異步通道的概念。 Netty是一個(gè)提供異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用框架,用以快速開發(fā)高性能、高可靠的網(wǎng)絡(luò)服務(wù)器和客戶端程序。Netty簡化了網(wǎng)絡(luò)程序的開發(fā),是很多框架和公司...

    VincentFF 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<