国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Java解讀NIO Socket非阻塞模式

開發 后端
NIO 有一個主要的類Selector,這個類似一個觀察者,只要我們把需要探知的socketchannel告訴Selector,我們接著做別的事情,當有 事件發生時,他會通知我們,傳回一組SelectionKey,我們讀取這些Key,就會獲得我們剛剛注冊過的socketchannel,然后,我們從 這個Channel中讀取數據,放心,包準能夠讀到,接著我們可以處理這些數據。

NIO主要原理和適用

NIO 有一個主要的類Selector,這個類似一個觀察者,只要我們把需要探知的socketchannel告訴Selector,我們接著做別的事情,當有 事件發生時,他會通知我們,傳回一組SelectionKey,我們讀取這些Key,就會獲得我們剛剛注冊過的socketchannel,然后,我們從 這個Channel中讀取數據,放心,包準能夠讀到,接著我們可以處理這些數據。

Selector內部原理實際是在做一個對所注冊的channel的輪詢訪問,不斷的輪詢(目前就這一個算法),一旦輪詢到一個channel有所注冊的事情發生,比如數據來了,他就會站起來報告,交出一把鑰匙,讓我們通過這把鑰匙來讀取這個channel的內容。

jdk供的無阻塞I/O(NIO)有效解決了多線程服務器存在的線程開銷問題,但在使用上略顯得復雜一些。在NIO中使用多線程,主要目的已不是為了應對 每個客戶端請求而分配獨立的服務線程,而是通過多線程充分使用用多個CPU的處理能力和處理中的等待時間,達到提高服務能力的目的。

這段時間在研究NIO,寫篇博客來記住學過的東西。還是從最簡單的Hello World開始,client多線程請求server端,server接收client的名字,并返回Hello! +名字的字符格式給client。當然實際應用并不這么簡單,實際可能是訪問文件或者數據庫獲取信息返回給client。非阻塞的NIO有何神秘之處?

代 碼:

1)server端代碼

  1. public class HelloWorldServer {   
  2.  
  3.     static int BLOCK = 1024;   
  4.     static String name = "";   
  5.     protected Selector selector;   
  6.     protected ByteBuffer clientBuffer = ByteBuffer.allocate(BLOCK);   
  7.     protected CharsetDecoder decoder;   
  8.     static CharsetEncoder encoder = Charset.forName("GB2312").newEncoder();   
  9.  
  10.     public HelloWorldServer(int port) throws IOException {   
  11.         selector = this.getSelector(port);   
  12.         Charset charset = Charset.forName("GB2312");   
  13.         decoder = charset.newDecoder();   
  14.     }   
  15.  
  16.     // 獲取Selector   
  17.     protected Selector getSelector(int port) throws IOException {   
  18.         ServerSocketChannel server = ServerSocketChannel.open();   
  19.         Selector sel = Selector.open();   
  20.         server.socket().bind(new InetSocketAddress(port));   
  21.         server.configureBlocking(false);   
  22.         server.register(sel, SelectionKey.OP_ACCEPT);   
  23.         return sel;   
  24.     }   
  25.  
  26.     // 監聽端口   
  27.     public void listen() {   
  28.         try {   
  29.             for (;;) {   
  30.                 selector.select();   
  31.                 Iterator iter = selector.selectedKeys().iterator();   
  32.                 while (iter.hasNext()) {   
  33.                     SelectionKey key = (SelectionKey) iter.next();   
  34.                     iter.remove();   
  35.                     process(key);   
  36.                 }   
  37.             }   
  38.         } catch (IOException e) {   
  39.             e.printStackTrace();   
  40.         }   
  41.     }   
  42.  
  43.     // 處理事件   
  44.     protected void process(SelectionKey key) throws IOException {   
  45.         if (key.isAcceptable()) { // 接收請求   
  46.             ServerSocketChannel server = (ServerSocketChannel) key.channel();   
  47.             SocketChannel channel = server.accept();   
  48.             //設置非阻塞模式   
  49.             channel.configureBlocking(false);   
  50.             channel.register(selector, SelectionKey.OP_READ);   
  51.         } else if (key.isReadable()) { // 讀信息   
  52.             SocketChannel channel = (SocketChannel) key.channel();   
  53.             int count = channel.read(clientBuffer);   
  54.             if (count > 0) {   
  55.                 clientBuffer.flip();   
  56.                 CharBuffer charBuffer = decoder.decode(clientBuffer);   
  57.                 name = charBuffer.toString();   
  58.                 // System.out.println(name);   
  59.                 SelectionKey sKey = channel.register(selector,   
  60.                         SelectionKey.OP_WRITE);   
  61.                 sKey.attach(name);   
  62.             } else {   
  63.                 channel.close();   
  64.             }   
  65.  
  66.             clientBuffer.clear();   
  67.         } else if (key.isWritable()) { // 寫事件   
  68.             SocketChannel channel = (SocketChannel) key.channel();   
  69.             String name = (String) key.attachment();   
  70.                
  71.             ByteBuffer block = encoder.encode(CharBuffer   
  72.                     .wrap("Hello !" + name));   
  73.                
  74.  
  75.             channel.write(block);   
  76.  
  77.             //channel.close();   
  78.  
  79.         }   
  80.     }   
  81.  
  82.     public static void main(String[] args) {   
  83.         int port = 8888;   
  84.         try {   
  85.             HelloWorldServer server = new HelloWorldServer(port);   
  86.             System.out.println("listening on " + port);   
  87.                
  88.             server.listen();   
  89.                
  90.         } catch (IOException e) {   
  91.             e.printStackTrace();   
  92.         }   
  93.     }   
  94. }  

2)client端代碼

  1. public class HelloWorldClient {   
  2.  
  3.     static int SIZE = 10;   
  4.     static InetSocketAddress ip = new InetSocketAddress("localhost"8888);   
  5.     static CharsetEncoder encoder = Charset.forName("GB2312").newEncoder();   
  6.  
  7.     static class Message implements Runnable {   
  8.         protected String name;   
  9.         String msg = "";   
  10.  
  11.         public Message(String index) {   
  12.             this.name = index;   
  13.         }   
  14.  
  15.         public void run() {   
  16.             try {   
  17.                 long start = System.currentTimeMillis();   
  18.                 //打開Socket通道   
  19.                 SocketChannel client = SocketChannel.open();   
  20.                 //設置為非阻塞模式   
  21.                 client.configureBlocking(false);   
  22.                 //打開選擇器   
  23.                 Selector selector = Selector.open();   
  24.                 //注冊連接服務端socket動作   
  25.                 client.register(selector, SelectionKey.OP_CONNECT);   
  26.                 //連接   
  27.                 client.connect(ip);   
  28.                 //分配內存   
  29.                 ByteBuffer buffer = ByteBuffer.allocate(8 * 1024);   
  30.                 int total = 0;   
  31.  
  32.                 _FOR: for (;;) {   
  33.                     selector.select();   
  34.                     Iterator iter = selector.selectedKeys().iterator();   
  35.  
  36.                     while (iter.hasNext()) {   
  37.                         SelectionKey key = (SelectionKey) iter.next();   
  38.                         iter.remove();   
  39.                         if (key.isConnectable()) {   
  40.                             SocketChannel channel = (SocketChannel) key   
  41.                                     .channel();   
  42.                             if (channel.isConnectionPending())   
  43.                                 channel.finishConnect();   
  44.                             channel   
  45.                                     .write(encoder   
  46.                                             .encode(CharBuffer.wrap(name)));   
  47.  
  48.                             channel.register(selector, SelectionKey.OP_READ);   
  49.                         } else if (key.isReadable()) {   
  50.                             SocketChannel channel = (SocketChannel) key   
  51.                                     .channel();   
  52.                             int count = channel.read(buffer);   
  53.                             if (count > 0) {   
  54.                                 total += count;   
  55.                                 buffer.flip();   
  56.  
  57.                                 while (buffer.remaining() > 0) {   
  58.                                     byte b = buffer.get();   
  59.                                     msg += (char) b;   
  60.                                        
  61.                                 }   
  62.  
  63.                                 buffer.clear();   
  64.                             } else {   
  65.                                 client.close();   
  66.                                 break _FOR;   
  67.                             }   
  68.                         }   
  69.                     }   
  70.                 }   
  71.                 double last = (System.currentTimeMillis() - start) * 1.0 / 1000;   
  72.                 System.out.println(msg + "used time :" + last + "s.");   
  73.                 msg = "";   
  74.             } catch (IOException e) {   
  75.                 e.printStackTrace();   
  76.             }   
  77.         }   
  78.     }   
  79.  
  80.     public static void main(String[] args) throws IOException {   
  81.        
  82.         String names[] = new String[SIZE];   
  83.  
  84.         for (int index = 0; index < SIZE; index++) {   
  85.             names[index] = "jeff[" + index + "]";   
  86.             new Thread(new Message(names[index])).start();   
  87.         }   
  88.        
  89.     }   
  90. }  

原文鏈接:http://itemdetail.iteye.com/blog/787149

【編輯推薦】

  1. 利用NIO建立Socket服務器
  2. 用Java.nio.* 進行網絡編程
  3. Java NIO的wakeup剖析
  4. Java NIO類庫關系圖解
  5. 淺析Tomcat NIO 配置
責任編輯:林師授 來源: 虛客_zZ的博客
相關推薦

2011-12-08 10:12:34

JavaNIO

2023-07-31 08:55:01

Java NIO非阻塞阻塞

2021-02-04 10:50:11

網絡安全非阻塞模Winsock編程

2020-05-08 10:34:30

Spring非阻塞編程

2011-12-14 10:31:43

2021-03-04 08:34:55

同步阻塞非阻塞

2021-06-04 18:14:15

阻塞非阻塞tcp

2011-12-13 12:32:54

JavaNIO

2011-12-02 13:16:14

JavaNIO

2019-05-05 08:50:42

阻塞非阻塞BIO

2019-10-18 08:22:43

BIONIOAIO

2021-02-27 16:08:17

Java異步非阻塞

2019-07-23 11:01:57

Python同步異步

2017-03-01 16:40:12

Linux驅動技術設備阻塞

2011-12-07 17:05:45

JavaNIO

2012-10-10 10:00:27

同步異步開發Java

2016-11-28 09:08:43

java系統異步非阻塞

2011-03-11 09:51:47

Java NIO

2018-03-28 08:52:53

阻塞非阻塞I

2012-02-22 21:15:41

unixIO阻塞
點贊
收藏

51CTO技術棧公眾號

av电影在线网| 亚洲专区欧美专区| 成人欧美一区二区三区黑人免费| 免费高清视频精品| 欧美高清成人| 九九精品视频在线观看| 国产精品小仙女| xvideos国产在线视频| 国产97人人超碰caoprom| 国产99久久久国产精品| 国产二区视频在线| 久久精品亚洲国产奇米99| 黄色小说在线播放| 午夜啪啪福利视频| 精品电影一区二区| 在线视频精品| 麻豆网站视频在线观看| 成人免费视频视频在| 欧美剧情电影在线观看完整版免费励志电影 | 亚洲午夜免费视频| 国产亚洲第一伦理第一区| 污污网址在线观看| 国产日韩欧美夫妻视频在线观看| 亚洲精品伦理在线| 天天影视综合| 丁香高清在线观看完整电影视频| 91嫩草国产丨精品入口麻豆| 欧美成人免费一级人片100| 中文字幕精品三区| 欧美日韩爆操| 免费看av不卡| 久草香蕉在线| 97久久夜色精品国产九色| 亚洲成人在线网| 大胆亚洲人体视频| 日韩精品91| 成人免费毛片嘿嘿连载视频…| 国产精品亚洲αv天堂无码| 国语自产偷拍精品视频偷 | 丝袜诱惑制服诱惑色一区在线观看 | 国产精品普通话| 91精品国产色综合久久久蜜香臀| 国产成人精品免费视频网站| 视频在线观看免费影院欧美meiju| 日本免费一区二区三区最新| 在线观看日本一区| 欧美一区二区三区艳史| 亚洲高清色综合| 国产精品久久久久久一区二区三区| 亚洲茄子视频| 欧美丝袜美腿| 好吊日av在线| 国产精品自拍视频在线| 亚洲一区二区自拍偷拍| 91久久精品久久国产性色也91| 久久韩国免费视频| 日韩精品免费在线| 天天色 色综合| 97久久精品人人爽人人爽蜜臀| 精品视频免费在线观看| 亚洲精品aaa| 神马电影网我不卡| 成人黄色网址| 精品视频一二三| 中文在线а天堂av| www.99av| 亚洲77777| www.日本少妇| 丝袜人妻一区二区三区| 亚洲最新在线| 一区二区三区久久网| 久久久久综合一区二区三区| 99国精产品一二二线| 国产精品美乳一区二区免费| 欧美一级片在线观看| 欧美视频一区二区三区| 精品亚洲夜色av98在线观看| 丁香婷婷综合色啪| 黄色在线免费观看网站| 久久涩涩网站| 精品无人区太爽高潮在线播放| 四季av在线一区二区三区| 国产一区一区三区| 亚洲成人精品av| 亚洲猫色日本管| 日韩精品亚洲专区| 东京一区二区| 精品一区二区三区国产| 欧美成人精品在线| 欧美日韩亚州综合| 在线观看欧美黄色| 色视频一区二区| 欧美吻胸吃奶大尺度电影| 777精品伊人久久久久大香线蕉| 欧美另类高清zo欧美| 日韩一级大片在线观看| 成人欧美一区二区三区小说| 中文字幕中文字幕一区二区| youjizz国产精品| 国产精品乱子久久久久| 精品久久中文字幕| 亚洲国产精彩中文乱码av| 国产一区二区欧美日韩| 国内揄拍国内精品| 国产区一区二区三区| 男人草女人视频| 97福利电影| 黄色免费网站在线观看| 99久久综合国产精品二区| 丝袜久久网站| 日韩av不卡在线观看| 国产网红主播福利一区二区| 国产视频一区不卡| 91精品国产综合久久国产大片 | 欧美日韩99| 国产亚洲精久久久久久| 欧美高清激情brazzers| 精品对白一区国产伦| 欧美一区二区视频97| 亚洲二区三区四区| 一级片在线播放| 亚洲国产福利| 日本亚洲不卡| 国产精品资源在线观看| 一本一道久久a久久精品综合蜜臀| 亚洲天堂网在线观看| 久久精品二区| 蜜臀在线观看| 中文字幕一区日韩精品 | 成人全视频免费观看在线看| 亚洲精品免费观看| 亚洲精品视频在线观看网站| 亚洲午夜激情免费视频| 国产成人一区二区| 黑鬼大战白妞高潮喷白浆| 成人黄色动漫| 国产精品v亚洲精品v日韩精品 | 亚洲尤物精选| 欧美日韩一区二区三区四区 | 精品久久久三级丝袜| 国产精品成人观看视频免费| 2018高清国产日本一道国产| rebdb初裸写真在线观看| 乱人伦精品视频在线观看| 日韩av一区在线观看| 亚洲高清在线观看| 亚洲精品久久久久国产| 日韩av中文字幕在线| 国产suv精品一区二区三区88区| 国产精品久久久久久久久久久新郎 | 91精品国产乱码久久蜜臀| 97成人超碰免| 在线观看福利一区| 国产视频97| 麻豆免费在线| 免费高清在线一区| 永久免费精品影视网站| 97超碰青青草| 粉嫩久久久久久久极品| 亚洲日本乱码在线观看| 国产综合香蕉五月婷在线| 伊人国产在线| 欧美一区二区麻豆红桃视频| 亚洲成在线观看| 26uuu亚洲国产精品| 欧美色视频免费| 一本色道久久| 亚洲第一精品福利| 国产精品99久久99久久久| 国产视频一区欧美| 亚洲精品理论电影| 老头吃奶性行交视频| 国产一区二区三区四区五区传媒| 色久优优欧美色久优优| 区一区二区三区中文字幕| 成人国产精品| 日本大香伊一区二区三区| 日韩一本精品| 成人免费视频观看| 欧美视频一区二区三区…| 成人在线激情视频| 男女视频在线| 亚洲欧洲综合另类在线| 天天成人综合网| 97精品97| 日韩在线观看成人| 欧美尤物美女在线| 在线观看国产v片| 国产美女一区二区三区| 97视频在线免费观看| 可以在线观看的av网站| 久久久无码精品亚洲日韩按摩| 91久热免费在线视频| 高清一区二区中文字幕| 欧美日韩国产综合久久 | 久久久久北条麻妃免费看| 妞干网免费视频| 99re这里都是精品| 亚洲欧洲在线一区| 99国产精品|