偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

這篇Java的NIO編程,保證你能看懂

開(kāi)發(fā) 后端
NIO編程一直是Java知識(shí)體系中的一個(gè)重點(diǎn)。前幾年的時(shí)間面試的門(mén)檻是了解NIO,現(xiàn)在就不一樣了,最起碼也要精通NIO,因此學(xué)習(xí)javaNIO編程是非常有必要的。這篇文章就開(kāi)始對(duì)NIO進(jìn)行一個(gè)認(rèn)識(shí)。

 NIO編程一直是Java知識(shí)體系中的一個(gè)重點(diǎn)。前幾年的時(shí)間面試的門(mén)檻是了解NIO,現(xiàn)在就不一樣了,最起碼也要精通NIO,因此學(xué)習(xí)javaNIO編程是非常有必要的。這篇文章就開(kāi)始對(duì)NIO進(jìn)行一個(gè)認(rèn)識(shí)。本文參考了慕課網(wǎng),特在此說(shuō)明。

[[276021]]

一、認(rèn)識(shí)NIO

1、什么是BIO?

想要學(xué)習(xí)NIO,那我們就必須先要認(rèn)識(shí)一下BIO,在JDK1,4之前,我們使用網(wǎng)絡(luò)連接的時(shí)候一直都是使用的BIO,也就是阻塞式,網(wǎng)絡(luò)模型是下面這個(gè)樣子的。

 

這篇java的NIO編程,保證你能看懂

 

上面這個(gè)網(wǎng)絡(luò)模型是這樣的。

(1)server創(chuàng)建初始化一些預(yù)備工作之后,就開(kāi)始等待客戶端client的鏈接

(2)client開(kāi)始鏈接server。

(3)server一旦請(qǐng)求到client的請(qǐng)求之后就會(huì)開(kāi)啟一個(gè)線程去處理。

就好比是只有一家餐飲店,每進(jìn)來(lái)一個(gè)顧客,我們就需要去創(chuàng)建一個(gè)線程去處理。這就是BIO。他的缺點(diǎn)可想而知。如果客戶端很多的話,server就必須要開(kāi)啟很多個(gè)Thread去處理,這樣也太麻煩了。畢竟像淘寶微信這樣的平臺(tái)好幾億人再用,而且請(qǐng)求量這么大,總不能開(kāi)啟幾億個(gè)線程去處理吧。這時(shí)候在jdk1.4就出現(xiàn)了NIO。

2、出現(xiàn)了NIO

既然BIO有這么多的缺點(diǎn),java官方肯定也明白,于是在jdk1.4的時(shí)候及時(shí)的加入了NIO。

這篇java的NIO編程,保證你能看懂

這個(gè)跟上一個(gè)的區(qū)別我們來(lái)捋一下:

(1)一個(gè)客戶端進(jìn)來(lái)之后首先加入到Set中

(2)server時(shí)刻輪詢著這個(gè)set,一旦發(fā)現(xiàn)有客戶端連接進(jìn)來(lái)就開(kāi)始handler

(3)多個(gè)client連接進(jìn)來(lái)的時(shí)候,都保存在這個(gè)set中,這樣我們就可以輪詢處理多個(gè)client了。

這就NIO,他的優(yōu)點(diǎn)從上面的圖也可以看出來(lái)。我們可能只需要?jiǎng)?chuàng)建一個(gè)Thread就可以處理所有的client了。當(dāng)然每一個(gè)client要做的事情不一樣,有的是連接請(qǐng)求,有的是讀寫(xiě)請(qǐng)求,這時(shí)候server就可以根據(jù)不同的請(qǐng)求使用不同的handler了。再給出一張圖看一下:

這篇java的NIO編程,保證你能看懂

當(dāng)然,這只是列舉出了NIO的特點(diǎn),還有大致網(wǎng)絡(luò)模型,想要去真正的了解他,還是代碼來(lái)的直接。

二、代碼實(shí)現(xiàn)

1、基本概念

在正式開(kāi)始代碼的編寫(xiě)之前,我們還要先認(rèn)識(shí)一下涉及到的幾個(gè)類(lèi)。

(1)channel

它相當(dāng)于是一個(gè)通道,這個(gè)通道是流通數(shù)據(jù)的,我們既可以從通道中讀取數(shù)據(jù),又可以寫(xiě)數(shù)據(jù)到通道。常見(jiàn)的channel有四個(gè):FileChannel、DatagramChannel、SocketChannel、ServerSocketChannel。

FileChannel 從文件中讀寫(xiě)數(shù)據(jù)。

DatagramChannel 能通過(guò)UDP讀寫(xiě)網(wǎng)絡(luò)中的數(shù)據(jù)。

SocketChannel 能通過(guò)TCP讀寫(xiě)網(wǎng)絡(luò)中的數(shù)據(jù)。

ServerSocketChannel可以監(jiān)聽(tīng)新進(jìn)來(lái)的TCP連接,像Web服務(wù)器那樣。對(duì)每一個(gè)新進(jìn)來(lái)的連接都會(huì)創(chuàng)建一個(gè)SocketChannel。

(2)Buffer

Buffer用于和通道進(jìn)行交互。數(shù)據(jù)是從通道讀入緩沖區(qū),從緩沖區(qū)寫(xiě)入到通道中的。

這篇java的NIO編程,保證你能看懂

使用Buffer讀寫(xiě)數(shù)據(jù)一般遵循以下四個(gè)步驟:

  • 寫(xiě)入數(shù)據(jù)到Buffer
  • 調(diào)用flip()方法
  • 從Buffer中讀取數(shù)據(jù)
  • 調(diào)用clear()方法或者compact()方法

(3)Selector

Selector(選擇器)能夠檢測(cè)一到多個(gè)NIO通道,并能夠知曉通道是否為諸如讀寫(xiě)事件做好準(zhǔn)備的組件。這樣,一個(gè)單獨(dú)的線程可以管理多個(gè)channel,從而管理多個(gè)網(wǎng)絡(luò)連接。

這篇java的NIO編程,保證你能看懂

2、實(shí)現(xiàn)步驟

我們?cè)谶@里實(shí)現(xiàn)一個(gè)類(lèi)似于聊天室的案例,上面已經(jīng)把NIO涉及到的一些核心類(lèi)說(shuō)了一下,下面說(shuō)一下實(shí)現(xiàn)的步驟。這個(gè)步驟是要結(jié)合上面的圖來(lái)理解會(huì)比較容易一些:

第一步:創(chuàng)建Selector

第二步:創(chuàng)建ServerSocketChannel,綁定監(jiān)聽(tīng)端口

第三步:將Channel設(shè)置為非阻塞模式

第四步:將Channel注冊(cè)到Selector上,監(jiān)聽(tīng)連接事件

第五步:循環(huán)調(diào)用Selector的select方法,檢測(cè)就緒情況

第六步:調(diào)用selectedKeys方法獲取就緒channel集合

第七步:判斷就緒事件種類(lèi),調(diào)用業(yè)務(wù)處理方法

第八步:根據(jù)業(yè)務(wù)需要決定是否再次注冊(cè)監(jiān)聽(tīng)事件,重復(fù)執(zhí)行第三步操作

有了這個(gè)步驟我們?cè)偃ゴa實(shí)現(xiàn)。

3、代碼實(shí)現(xiàn)

(1)server端代碼開(kāi)發(fā)

首先我們看一下服務(wù)器端

這篇java的NIO編程,保證你能看懂
這篇java的NIO編程,保證你能看懂

上面把server中基本的是步驟實(shí)現(xiàn)了?,F(xiàn)在開(kāi)始真正的去處理一下。

第一種情況:鏈接事件處理

這篇java的NIO編程,保證你能看懂

第二種情況:讀寫(xiě)時(shí)間處理

 

這篇java的NIO編程,保證你能看懂

到了第五步broadCast方法其實(shí)我們可以對(duì)此進(jìn)行一個(gè)變化,在這里我們實(shí)現(xiàn)的是廣播到其他所有client。但是如果是一對(duì)一聊天的話我們就可以單播到指定client。

這篇java的NIO編程,保證你能看懂

這就是整個(gè)服務(wù)器端的開(kāi)發(fā),當(dāng)然還要客戶端的開(kāi)發(fā),我們同樣來(lái)看看。

(2)client端代碼開(kāi)發(fā)

客戶端代碼說(shuō)實(shí)話就比較輕松一點(diǎn)了。

 

這篇java的NIO編程,保證你能看懂

 

我們就再來(lái)看看,客戶端如何處理服務(wù)器端返回的數(shù)據(jù)。

 

這篇java的NIO編程,保證你能看懂

 

readHandler方法是如何讀取呢?

 

這篇java的NIO編程,保證你能看懂

 

到這一步,整個(gè)客戶端的代碼就算是完成了,如果你仔細(xì)的捋一遍,其實(shí)整個(gè)流程還是很清晰的。

三、總結(jié)

雖然NIO這么好其實(shí)還是有很多缺點(diǎn)的,在上面的代碼量其實(shí)你就可以發(fā)現(xiàn)了,大量的代碼使得我們?cè)跇?gòu)建復(fù)雜系統(tǒng)的時(shí)候超級(jí)麻煩,有時(shí)候正是這些技術(shù)的不完備,才造成了我們程序員工作量大,壓力大,但是科技的進(jìn)步畢竟是要一點(diǎn)一點(diǎn)發(fā)展的嘛。另外說(shuō)一句這個(gè)NIO還有一個(gè)大坑,就是Selector空輪詢的時(shí)候,導(dǎo)師CPU100%。不過(guò)這種情況我還沒(méi)試過(guò)。

想要精通NIO的話,這篇文章真的遠(yuǎn)遠(yuǎn)不夠,頂多算是入門(mén)把。想要真正認(rèn)識(shí)我覺(jué)得首先要深入源碼,然后就是實(shí)際場(chǎng)景中的使用,不過(guò)目前來(lái)看的話netty和mina框架要比java的NIO好的多,不單單是性能,更重要的是我們的開(kāi)發(fā)效率。算是在一定程度上避免了我們程序員“錢(qián)多話少死得快”的現(xiàn)象了吧。

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2020-02-28 08:00:35

單點(diǎn)登錄系統(tǒng)

2020-02-15 17:16:05

Kubernetes容器

2019-10-10 11:10:04

SpringBoot異步編程

2018-11-16 16:13:33

5G通信技術(shù)網(wǎng)絡(luò)

2017-02-22 15:04:52

2022-07-04 08:31:42

GitOpsGit基礎(chǔ)設(shè)施

2013-03-15 10:35:17

編程語(yǔ)言編程笑話

2019-09-05 11:14:12

監(jiān)控系統(tǒng)拓?fù)鋱D

2020-12-01 09:03:22

分庫(kù)分表MySQL

2020-01-21 10:16:15

Kubernetes教程容器

2019-11-18 10:38:03

線程池Java框架

2018-12-24 08:46:52

Kubernetes對(duì)象模型

2019-12-27 09:47:05

大數(shù)據(jù)TomcatWeb

2018-11-19 08:34:22

Hadoop架構(gòu)HDFS

2013-09-22 10:34:08

碼農(nóng)機(jī)器學(xué)習(xí)算法

2019-03-26 11:15:34

AI機(jī)器學(xué)習(xí)人工智能

2018-11-21 09:40:57

熔斷實(shí)踐AOP

2019-10-08 10:10:52

中臺(tái) IT后臺(tái)

2019-05-16 09:38:04

Redis高可用數(shù)據(jù)

2021-06-02 09:31:31

RSA2021
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)