java 网络编程 方式_JAVA网络编程
概念
BIO? 阻塞io,1.4之前
NIO? no-blocking io 非阻塞io,jdk1.4
AIO? 異步io,jdk1.7
瀏覽器輸入網址,敲下回車之后發生了什么?
1.URL解析
2.DNS解析
概念:Domain Name System,域名系統,本質上是一個分布式數據庫。將人類可讀的域名解析成計算機可讀的IP地址
解析順序:從右向左
域名的層級:類似于索引,一級一級更有效率的查找
DNS查詢的兩種方式:遞歸與迭代
網絡協議
各個層的數據包格式
一個數據包叫一個幀,最大1518字節,經過每個層的時候,會加上特定的標頭信息
java.io專業術語
字符流:相對高級,處理人類可以理解和閱讀的字符
基本字符流:
高級字符流:
字節流:相對低級,處理字節,1字節=8bit
基本字節流:
高級字節流:
設計模式:裝飾者模式,高級流套在低級流之上
Socket
socket以ip+port作為唯一標識,與網卡驅動進行綁定,實現點對點的通信
unix系統中,一切皆是文件,socket也不例外,這就是為什么在多路復用模型中,總是會提到文件描述符這個詞語了。
同步異步阻塞非阻塞
一個表白的故事,一個男生向心儀已久的女生表白
同步:女生想了一段時間,當場給出了自己的答復
異步:女生說,你讓我考慮幾天,想好了我會打你電話
阻塞:男生心心念念,茶不思飯不想,一心等待著女生的答復。
非阻塞:男生落落大方,個人生活并沒有被表白這一件事情完全占據,等待回復這段時間,正常在做自己的事情,比如打打籃球
線程池
本質上為了線程復用,銀行辦理業務的故事
單線程:只有一個柜員,顧客排隊辦理業務。
多線程非線程池:有客戶就招柜員,辦理完了就辭退柜員,再有新的顧客再重新招聘柜員,這無疑是非常可笑的。
線程池:有一批固定的柜員,平時作為常設窗口提供服務(核心線程數),
業務繁忙的時候,由HR去招聘一批員工(線程工廠),
如果窗口已經全部開放(最大線程數),客戶仍然很多,就需要在大廳排隊辦理(工作隊列),
如果業務非?;鸨?比如聽過銀行破產,儲戶爭相取款- -),整個大廳擠滿了客戶,那么對于其他大廳外的客戶,銀行只能說no,告知暫時無法提供服務(拒絕策略)
業務高峰過去之后,新招的員工并不會被立即辭退,只有那些長時間沒有業務的員工,才會被HR辭退(空閑時間)
java提供的線程池(除此之外 ,還有手動創建,ThreadpoolExecutor、ScheduledThreadpoolExecutor、Fork Join Pool):
JAVA IO的前世:BIO阻塞模型
JAVA IO的今生:NIO非阻塞模型
buffer解析
channel是讀寫雙向的,依賴buffer來實現,通過flip()方法來實現讀/寫模式的翻轉
寫模式
讀模式,limit移動到之前寫模式的最后一條,position移動到起始位置。即只能讀取寫模式下寫入到buffer中的數據
如果數據全部讀取完,調用clear()方法重新轉換成寫模式,limit回到最末尾,position回到起始位置
clear()方法其實并沒有真的去清除buffer中的數據,只是移動了兩個指針而已,但是下次再寫入的時候,原有數據就會被覆蓋,效果上等同于清除,是一個很巧妙而高效的方法
如果數據并未全部讀完,在這之前需要先轉換成寫模式,則調用compact()方法
compact()方法把之前未讀完的數據復制到buffer的最前面,然后把position指向緊跟著的那個位置,從這個位置開始寫入新的數據,limit移動到末尾,這樣可以確保每次讀的時候是從上一次未讀取完的位置開始繼續讀取。
channel解析
channel之間可以直接進行數據交換
幾個重要的channel
多方法實現文件拷貝
不帶緩沖區的字節流拷貝
帶緩沖區的字節流拷貝
基于channer的buffer進行拷貝
兩個channel之間直接拷貝
性能對比:三個不同大小的文件,小的400K,中等的10M。大的500M,四個拷貝方法均執行5次,取平均值進行比較
不帶緩沖區的字節流拷貝性能非常差,幾千倍的差距
其他三種方法差別不大,隨著文件的增大,nio的方法效率相對來說比傳統的bufferedStream好一些
其實傳統io的方法實現在新版本的jdk中已經被重寫過了,在jdk1.4的時候,nio方法的性能要比傳統io好很多,目前主流的jdk1.8中,底層實現差不多,所以性能沒有太明顯的差距了。
selector解析
所有的channel注冊在selector上面,由selector來監測channel的狀態變化
channel的狀態變化
connect:socketChannel連接到了服務器上
accept:serverSocketChannel接受了一個連接
read:channel上有數據,處于可讀狀態
write:channel處于可寫入狀態
在Selector上注冊channel
每個channel獲得一個唯一的SelectionKey,interestOps()關心的事件,readyOps()就緒的事件
使用selector選擇channel
select()統計所有注冊的channel事件就緒的個數,操作完之后需要手動的重置就緒狀態,以便當channel再次就緒的時候selector可以正確的統計
NIO編程模型
socketServerChannel注冊監聽accept事件,響應說明有新的socketChannel建立了連接,然后對這個新的socketChannel在selector上注冊監聽read事件,當read事件就緒的時候(buffer中有可讀數據),由selector所在的線程去處理該io請求
這樣,selector所在的這個線程可以同時處理多個io請求,不像BIO模型中每個io請求都需要有一個單獨的線程去一對一的阻塞處理
JAVA IO的后世之師:AIO異步模型
內核IO模型
阻塞式I/O:每次系統調用阻塞,知道成功返回數據為止
非阻塞式I/O:不停的進行系統調用,沒有數據就直接返回無數據,知道有成功返回為止
I/O多路復用:不再由應用程序自身不停的進行系統調用,交由selector來監聽事件,事件就緒的時候,會返回可讀條件,然后應用程序發起系統調用,成功返回數據
異步I/O:前面三種都是同步調用,無論是阻塞還是非阻塞,應用程序必須主動發起系統調用才能得到數據,在異步I/O模型中,應用程序先發起系統調用,如果此時數據沒有準備好,
則返回無數據(非阻塞),當未來的某個時間,內核將數據準備好了之后,就會執行相應的回調函數
異步調用機制
AIO中的異步操作
異步實現原理
基于Future,異步阻塞,用于客戶端
基于CompletionHandler,異步非阻塞,用于服務端 ,底層有一個AsyncronousChannelGroup線程池,用來執行回調函數,性能比nio的單線程同步非阻塞selector更高,AIO模型的精髓也就在這里。
AIO編程模型
三種IO模型適用情境
總結
以上是生活随笔為你收集整理的java 网络编程 方式_JAVA网络编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新神魔大陆安卓和苹果能一起玩吗(新神魔大
- 下一篇: ddos网页端平台(ddos网页平台搭建