1. 程式人生 > >傳統Socket IO與NIO的比較

傳統Socket IO與NIO的比較

傳統Socket IO特點

1、傳統IO有兩個阻塞點,一個是接收客戶端的阻塞點,另外一個是客戶連線後接收訊息的阻塞點

2、在單執行緒下,一個Server只能為一個客戶端服務,其他客戶端想連線服務端必須等待前一個客戶端釋放掉。

3、在多執行緒下,一個Server可以為多個客戶端服務,每來一個客戶端就給客戶端分配一個執行緒,這樣消耗的資源太多,類比server是一個餐廳,一個執行緒就是一個服務員,每來一個客人就安排一個服務員專門為其服務,如果客人多了,成本就高了。

這裡寫圖片描述

NIO特點

1、NIO主要有ServerSocketChannel,Selector,SocketChannel,SelectionKey幾個類組成

2、NIO是單執行緒的

3、只有一個阻塞點

4,、如果拿NIO比作成一個餐廳的話,ServerSocketChannel就相當於整個餐廳,SocketChannel相當於客人,Selector相當於服務員,SelectionKey相當於服務種類(迎接客人,點餐等)

A、餐廳開張時,會先開啟大門,這裡的大門相當於埠號,serverChannel.configureBlocking(false); //設定為非阻塞,相當於服務員不一定要站在大門口

     serverChannel.socket().bind(new InetSocketAddress(port));//大門地址  this.selector = Selector.open();//服務員開始工作

B、serverChannel.register(selector, SelectionKey.OP_ACCEPT);//告訴服務員要看著大門的情況,如果有客人來就要上去迎接

C、Set<SelectionKey> keys = selector.selectedKeys();迭代服務種類,此時服務員時刻都在監控著大門,一旦大門有客人進來,他就知道

D、如果Set裡有值了,說明有客人來或者有客人點餐了,先判斷下這個值是客人來了還是點餐了,第一次來的肯定是客人來了

E、key.isAcceptable() 表示客人從大門進來了,SocketChannel channel = server.accept(); 獲得了這個客人的資訊,channel.register(selector, SelectionKey.OP_READ);表示客人進來了,那就要叫他坐下來,這是服務員就要記住這個客人隨時都要點餐了

F、key.isReadable() 表示客戶開始點餐,客人把點餐的資訊告訴服務員。

這裡寫圖片描述

傳統IO與NIO的主要區別就是NIO不要一直阻塞著,一旦有訊息過來會主動告訴服務端,另外一個是NIO一個單執行緒可以處理N個客戶端。

相關推薦

傳統Socket IONIO比較

傳統Socket IO特點 1、傳統IO有兩個阻塞點,一個是接收客戶端的阻塞點,另外一個是客戶連線後接收訊息的阻塞點 2、在單執行緒下,一個Server只能為一個客戶端服務,其他客戶端想連線服務端必須等待前一個客戶端釋放掉。 3、在多執行緒下,一個Serv

傳統IONIO比較

我們先來看一段傳統IO的程式碼 public class OioServer { public static void

Java IONIO的總結、比較

one 何事 數據對象 容易 緩沖 rst 字符流 LEDE 如何 一、IO流總結   1、Java I/O主要包括如下3層次:   流式部分——最主要的部分。如:OutputStream、InputStream、Writer、Reader等  非流式部分——如:File類

SpringMVC 檔案下載之 --- IONIO實現及其效能比較

我的Controller類:FileController.javapackage aboo.controller; import aboo.bean.FileInfo; import aboo.service.FileService; import io.swagger.annotations.Api; i

IONIO對於非同步Socket的處理

以下的內容以程式碼為主,簡單的展示了傳統IO流和NIO流對Socket請求的處理。 簡單來說,傳統IO流想要處理多個客戶端的Socket請求,它必須要不斷的建立新的執行緒來專門為連入的Socket請求進行處理,如果連入的Socket請求很多,並且來自不同的IP或者埠就必須要

Java NIOIONIO的區別

文件 目的 讀取數據 簡單的 什麽 毫無 log 再處理 很多 一、概念 NIO即New IO,這個庫是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但實現方式不同,NIO主要用到的是塊,所以NIO的效率要比IO高很多。在Java API中提供了

IONIO的區別

rom tool div 線程 靈活性 計算 何事 一個 不知道 一、概念 NIO即New IO,這個庫是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但實現方式不同,NIO主要用到的是塊,所以NIO的效率要比IO高很多。在Java API中提供了兩套

IONIO

連續 測試 import bsp 兩個 同時 col team 關閉 IO 流的概念: java中數據的傳輸以流的形式體現(向水在管道中流動一樣) 流的分類 流按流向分為:輸入流,輸出流。 輸入流:程序從外部讀取數據

nodejs訊息推送之socket.io ws對比

node.js的websocket庫目前比較熱門的是ws和socket.io。我們對比一下這兩個庫。 一、筆者寫這篇文章時,ws的周下載量是4百多萬,最近一次更新是11天前,總共98個版本。 socket.io周下載量接近2百萬,最近一次更新是三個月前。總共110個版本 從n

IO NIO

回調函數 tail 網絡數 epo 技術 判斷 比較 模型 article 阻塞概念:應用程序在獲取網絡數據的時候,如果網絡傳輸數據很慢,那麽程序就一直等著,知道傳輸完畢為止。 非阻塞概念:應用程序直接可以獲取到已經轉備好的數據,無需等待。 IO為同步阻塞形式,NIO為同步

Java中IONIO的區別和使用場景

這幾天主要學習了NIO,因為之前對IO使用的也比較多,所以有一個簡單的對比,並且把學習的成果記錄下來。   java.NIO包裡包括三個基本的元件 l buffer:因為NIO是基於緩衝的,所以buffer是最底層的必要類,這也是IO和NIO的根本不同,雖然strea

cocos creator socket.io node.js socket.io通訊

1)客戶端 if (window.io == null){ window.io = require("./3rd/socket-io.js"); } var socketio = { sio: null, connect: function (url) {

IONIO的區別,阻塞非阻塞的區別

阻塞概念:應用程式在獲取網路資料的時候,如果網路傳輸資料很慢,那麼程式就一直等著,知道傳輸完畢為止。 非阻塞概念:應用程式直接可以獲取到已經轉備好的資料,無需等待。 IO為同步阻塞形式,NIO為同步非阻塞形式、NIO並沒有實現非同步,在JDK1.7之後,升級

通過Socket.IOnodeJs實現即時訊息推送

很早開始就想用WebSocket完成即時訊息推送功能。之前本打算用WebSocket + C#實現的,結果人上了年紀變笨了,弄了一天也沒弄好 ⊙﹏⊙ 今天參考了幾篇資料,終於搞定了一個Socket.IO結合nodeJs的Demo。 用Socket.IO有個很大的好處就是開

BIONIO比較及例子

java NIO的工作原理:1. 由一個專門的執行緒來處理所有的 IO 事件,並負責分發。 2. 事件驅動機制:事件到的時候觸發,而不是同步的去監視事件。 3. 執行緒通訊:執行緒之間通過 wait,notify 等方式通訊。保證每次上下文切換都是有意義的。減少無謂的執行緒切換。如下圖:一個執行緒Reacto

關於Java IONIO知識都在這裡

IO流學習總結 主要內容: (1) 按操作方式分類結構圖: (2)按操作物件分類結構圖 IO流的分類: 按照流的流向分,可以分為輸入流和輸出流; 按照操作單元劃分,可以劃分為位元組流和字元流; 按照流的角色劃分為節

【雜談】對IONIO的認識

IO流與NIO塊的資料快取    Java的IO是面向流設計的,通常我們通過IO流讀取資料,只能指定讀取資料的大小,而不能選擇資料讀取的起始位置。資料就像流水一樣,流過我們的應用,一旦流過就無法回頭。除非我們的程式碼對所讀取的資料進行快取,否則就再也見不到它了(針對此次流操作)。   比如,我們建立一個byt

傳統ioNIO詳細比較

提起java的io,我們都會提到傳統io,nio。也會想到時下比較熱門的netty這個io框架。那傳統io,是如何演變成nio的呢?它們之間有什麼異同呢?接下來我們將從傳統io談起,系統完整的解答io的相關問題。一:傳統io只要學過io的人都知道,傳統io處理讀取的時候通常是

基於socket.io客戶端服務端的相互通訊

dem send ins 返回 on() .com cal selector req socket.io是對websocket的封裝,用於客戶端與服務端的相互通訊。官網:https://socket.io/。 下面是socket.io的用法: 1、由於使用express

IO方式的認知“BIONIO、AIO的區別”

同步和異步 返回 對數 阻塞io 簡單 borde ng- 一定的 兩種 轉自:http://blog.csdn.net/skiof007/article/details/52873421 ------------------------------------------