摘要:是什么就不在此文展開,這篇主要來介紹下我們要怎樣通過來構建一個服務客戶端程序的。的通信完全依賴與,數據的寫入和讀取都是通過從中寫入讀取。和上的調用一樣的功能,監聽已經注冊在上面的文件描述符,監聽上的事件。
NIO是什么就不在此文展開,這篇主要來介紹下我們要怎樣通過java NIO來構建一個服務客戶端程序的。
0x01 涉及知識點NIO建立一個服務端和客戶端程序主要涉及的知識點有:
channel
selector
buffer
如果通過C/C++寫過通信程序的應該知道都是通過linux提供的系統調用來完成,java NIO的實現思想上沒有什么變化只是在實現方式上換了一種新的概念,并提供了更友好的開發模式供開發人員更加簡便快捷的來實現自己想要的功能。
channel:NIO的通信完全依賴與channel,數據的寫入和讀取都是通過channel從buffer中寫入/讀取。
selector:和linux上的select調用一樣的功能,監聽已經注冊在上面的socket文件描述符,java NIO監聽channel上的事件。主要有:OP_CONNECT()、OP_ACCEPT、OP_READ、OP_WRITE。
buffer主要是從channel中讀出數據或者寫入數據到channel。
0x02 serverpublic class NioServer { public static void main(String[] args) { try { // 建立一個serversocketchannel,用于監聽是否有連接到來 ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); // 設置為非阻塞模式 serverSocketChannel.configureBlocking(false); // 綁定監聽的地址 serverSocketChannel.bind(new InetSocketAddress(8080)); // 獲取一個selector Selector selector = Selector.open(); // 將channel注冊到selector中,并且這個channel關心的是accept事件 serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); while(true) { int readySize = selector.select(); if(readySize == 0) { continue; } // 獲取有事件到來的selectKeys Set0x03 clientselectionKeys = selector.selectedKeys(); // 處理到來的事件 for(Iterator iter = selectionKeys.iterator(); iter.hasNext(); ) { SelectionKey selectionKey = iter.next(); // 要將已經被處理的selectionKey刪除掉 iter.remove(); if(selectionKey.isAcceptable()) { System.out.println("acceptable"); ServerSocketChannel listenChannel = (ServerSocketChannel) selectionKey.channel(); /* 獲取連接進來的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); /* 相應的channel連接斷開了將其關閉掉 */ if(readSize == -1) { socketChannel.close(); selectionKey.cancel(); continue; } /* 將客戶端寫入的數據顯示出來 */ byte[] bytes = byteBuffer.array(); String message = new String(bytes).trim(); System.out.println(message); } } } } catch (Exception ex) { ex.printStackTrace(); } } }
public class NioClient { public static void main(String[] args) { SocketChannel socketChannel = null; try { socketChannel = SocketChannel.open(); socketChannel.configureBlocking(false); // 發起連接請求 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; } Set0x04 參考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(); } } }
NIO相關的概念可以點這里
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/66220.html
摘要:異步可以讓你異步的使用,例如當線程從通道讀取數據到緩沖區時,線程還是可以進行其他事情。當數據被寫入到緩沖區時,線程可以繼續處理它。因此,單個的線程可以監聽多個數據通道。下面是系列文章的目錄概述通道之間的數據傳輸與原文譯者郭蕾校對方騰飛 Java NIO(New IO)是一個可以替代標準Java IO API的IO API(從Java 1.4開始),Java NIO提供了與標準IO不同的...
摘要:線程之間的切換對于操作系統來說是昂貴的。因此,單線程可以監視多個通道中的數據。當方法返回后,線程可以處理這些事件。 一 NIO簡介 Java NIO 是 java 1.4 之后新出的一套IO接口,這里的的新是相對于原有標準的Java IO和Java Networking接口。NIO提供了一種完全不同的操作方式。 NIO中的N可以理解為Non-blocking,不單純是New。 它支持面...
摘要:從通道進行數據寫入創建一個緩沖區,填充數據,并要求通道寫入數據。三之通道主要內容通道介紹通常來說中的所有都是從通道開始的。從中選擇選擇器維護注冊過的通道的集合,并且這種注冊關系都被封裝在當中停止選擇的方法方法和方法。 由于內容比較多,我下面放的一部分是我更新在我的微信公眾號上的鏈接,微信排版比較好看,更加利于閱讀。每一篇文章下面我都把文章的主要內容給列出來了,便于大家學習與回顧。 Ja...
摘要:簡介是由引進的異步由以下幾個核心部分組成和的對比和的區別主要體現在三個方面基于流而基于操作是阻塞的而操作是非阻塞的沒有概念而有概念基于與基于傳統的是面向字節流或字符流的而在中我們拋棄了傳統的流而是引入了和的概念在中我只能從中讀取數據到中或將 簡介 Java NIO 是由 Java 1.4 引進的異步 IO.Java NIO 由以下幾個核心部分組成: Channel Buffer Se...
摘要:學習和掌握技術已經不是一個攻城獅的加分技能,而是一個必備技能。是雙向的,不僅可以讀取數據還能保存數據,程序不能直接讀寫通道,只與緩沖區交互為了讓大家不被高并發與大量連接處理問題所困擾,動力節點推出了高效處理模型應用教程。 大家肯定了解Java IO, 但是對于NIO一般是陌生的,而現在使用到NIO的場景越來越多,很多技術框...
摘要:后改良為用線程池的方式代替新增線程,被稱為偽異步。最大的問題是阻塞,同步。每次請求都由程序執行并返回,這是同步的缺陷。這些都會被注冊在多路復用器上。多路復用器提供選擇已經就緒狀態任務的能力。并沒有采用的多路復用器,而是使用異步通道的概念。 Netty是一個提供異步事件驅動的網絡應用框架,用以快速開發高性能、高可靠的網絡服務器和客戶端程序。Netty簡化了網絡程序的開發,是很多框架和公司...
閱讀 2423·2021-11-16 11:44
閱讀 1891·2021-10-12 10:12
閱讀 2185·2021-09-22 15:22
閱讀 3018·2021-08-11 11:17
閱讀 1513·2019-08-29 16:53
閱讀 2661·2019-08-29 14:09
閱讀 3483·2019-08-29 14:03
閱讀 3311·2019-08-29 11:09