国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Java Se : Java NIO(服務(wù)端)與BIO(客戶端)通信

2019-11-14 21:18:35
字體:
供稿:網(wǎng)友
java Se : Java NIO(服務(wù)端)與BIO(客戶端)通信

Java目前有三種IO相關(guān)的API了,下面簡(jiǎn)單的說一下:

BIO,阻塞IO,最常用的Java IO API,提供一般的流的讀寫功能。相信學(xué)習(xí)Java的人,都用過。

NIO,非阻塞IO,在JDK1.4中開始出現(xiàn),大量應(yīng)用與服務(wù)器端編程,用于提高并發(fā)訪問的性能,常用的NIO框架有Netty,Mina。

AIO,異步IO,在JDK1.7開始出現(xiàn)。還沒有了解過,等以后了解了再說。

阻塞、非阻塞,同步、異步

在寫這篇文章前,在網(wǎng)上了解了一下,其中爭(zhēng)議最的問題要數(shù)阻塞、非阻塞怎么理解,異步、同步怎么理解。

由于每個(gè)人想法的不同,很難達(dá)到一個(gè)一致的答案,又沒有真正的大牛出來給這一個(gè)準(zhǔn)確的定義。這里也簡(jiǎn)單的說一下,我對(duì)這兩組名詞的理解。

1)阻塞、非阻塞

我認(rèn)為,BIO,NIO沒有大家想的那么復(fù)雜,就是底層實(shí)現(xiàn)中進(jìn)行數(shù)據(jù)的讀寫(IO)采取的兩種方案,只不過非阻塞讀寫要比阻塞IO讀寫更快一些。

bio中的InputStream#read()是一個(gè)block方法。

2)同步、異步

同步與異步,我認(rèn)為說的并不是IO本身,我認(rèn)為說的是程序采用的編程模型,也就是說采用的是同步的編程模型還是異步的編程模型。

BIO、NIO,他們的區(qū)別是操作系統(tǒng)讀寫數(shù)據(jù)采用的方式,他們是Java中的概念,在Java領(lǐng)域,他們的底層實(shí)現(xiàn)采用的是同步的編程模型。所以說BIO、NIO都是同步的。

AIO的底層實(shí)現(xiàn)應(yīng)當(dāng)是異步的編程模型,所以說它是異步IO。

這里我只是闡述了我對(duì)它們的理解,沒有與大家爭(zhēng)論到底怎么去理解他們。也許我沒有大家想的那么深遠(yuǎn),畢竟我只是學(xué)習(xí)了NIO不到一天時(shí)間而已。

針對(duì)BIO、NIO,服務(wù)器編程如何提高性能

一個(gè)程序運(yùn)行的快慢,一般有會(huì)受到兩個(gè)因素的影響:1)程序代碼是否高效,2)IO讀寫是否高效。曾經(jīng)看過這么一幅圖,大致內(nèi)容是:一幫不同角色的人(程序員、運(yùn)維、項(xiàng)目經(jīng)理等角色的人)在一起討論一個(gè)應(yīng)用程序效率地下的問題。

程序員說的是:給我3個(gè)月時(shí)間,我能夠讓程序運(yùn)行效率提高,當(dāng)然了,我要調(diào)整代碼的整體結(jié)構(gòu)…

運(yùn)維說:…

項(xiàng)目經(jīng)理說:換用讀寫更快的硬件設(shè)備解決這個(gè)問題。

故事我已經(jīng)無法還原,但是這個(gè)故事說的內(nèi)容就是程序優(yōu)化帶來的效率的提升遠(yuǎn)不及提高IO速度帶來的提升。

相比于BIO,NIO就是從讀寫來提升效率的。性能對(duì)于服務(wù)器來說尤為重要,服務(wù)器端編程并不是都采用了NIO編程。

Tomcat服務(wù)器內(nèi)部,就有BIO、NIO兩種方式。

1)BIO如何提高并發(fā)訪問

BIO,是一種阻塞IO,服務(wù)器端使用BIO進(jìn)行數(shù)據(jù)讀寫時(shí),一般都是采用了一個(gè)Socket請(qǐng)求對(duì)應(yīng)一個(gè)Thread的方式來提高性能的。

但是一臺(tái)服務(wù)器上,可以跑的線程數(shù)量也是有限制的:線程不是越多越好,畢竟線程間的切換,也是有不小的開銷。也不是越少越好,線程太少,極端情況下一個(gè)線程,如果用一個(gè)線程來解決用戶的并發(fā)訪問,服務(wù)器接收一個(gè)客戶的請(qǐng)求時(shí),其他人都要處于等待狀態(tài)。你訪問網(wǎng)頁,多數(shù)情況下超過5秒,估計(jì)你就關(guān)掉它了吧。

  或者采用線程池方案。

2)采用NIO編程時(shí) 如何提高并發(fā)訪問

采用選擇器輪詢可用通道,讀寫數(shù)據(jù)。具體的怎么做的就不說了,網(wǎng)上一大坨一大坨的,雖然網(wǎng)上大家寫的大多是copy別人的。下面給會(huì)出一個(gè)例子,所以這里就不多說了,不知道的可以網(wǎng)上找相關(guān)的文章。

一個(gè)Thread下開一個(gè)Selector,一個(gè)Selector處理多個(gè)Socket通道(也就是多個(gè)用于請(qǐng)求),這樣就是一個(gè)Thread線程可以同時(shí)處理多個(gè)用戶請(qǐng)求。

孰優(yōu)孰劣

假若說,服務(wù)器設(shè)置同時(shí)處理1000個(gè)用戶請(qǐng)求(也就是1000個(gè)處理用戶請(qǐng)求的線程)。假若有10000個(gè)人來發(fā)請(qǐng)求。

如果采用BIO API編程,那么就同時(shí)只能為1000個(gè)人服務(wù),其他的9000人就處于等待狀態(tài)。

如果采用NIO API編程,也開啟1000個(gè)線程,因?yàn)橐粋€(gè)Thread可以同時(shí)處理多個(gè)用戶請(qǐng)求,咱不說讓它處理太多了,就處理10個(gè)吧,這樣算下來,這個(gè)10000個(gè)用戶請(qǐng)求,就都可以處理了。

BIO(客戶端)與NIO(服務(wù)端)通信

今天學(xué)習(xí)了NIO,就用NIO來處理瀏覽器用戶請(qǐng)求吧。瀏覽器發(fā)送的肯定不是采用NIO API發(fā)送Socket請(qǐng)求的,肯定是使用了阻塞式IO,也就是對(duì)應(yīng)于Java中的BIO了。

package com.fjn.other.nio.socket; import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.InetSocketAddress;import java.net.ServerSocket;import java.net.Socket;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors; @SupView Code

上面的測(cè)試的是3個(gè)Client采用BIO API不斷的并發(fā)的發(fā)送Socket 請(qǐng)求到Server端。Server采用NIO API處理Client的請(qǐng)求并作出響應(yīng),然后Client接收響應(yīng)。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 崇左市| 德钦县| 阜平县| 九龙城区| 石河子市| 商丘市| 德清县| 南昌市| 湘潭市| 鲁甸县| 钟山县| 蛟河市| 文水县| 江达县| 玛曲县| 周宁县| 上林县| 宾阳县| 德昌县| 林西县| 扬中市| 绥阳县| 黑水县| 连城县| 崇礼县| 常宁市| 吉木萨尔县| 克东县| 建阳市| 宁城县| 侯马市| 和平县| 四子王旗| 曲阜市| 明星| 古浪县| 屏边| 社会| 襄汾县| 富源县| 阿坝|