《Java網(wǎng)絡(luò)編程面試題》
出版單位:北京尚學(xué)堂優(yōu)效學(xué)院
優(yōu)效學(xué)院由清華大學(xué)著名的IT教育領(lǐng)導(dǎo)者馬士兵老師創(chuàng)辦液斜,是一家線上線下相互融合的互聯(lián)網(wǎng)+培訓(xùn)機(jī)構(gòu)。公司均由海外留學(xué)生和國內(nèi)行業(yè)精英人士擔(dān)任授課講師叠穆,主要成員均碩士且擁有十多年的行業(yè)經(jīng)驗(yàn)少漆。畢業(yè)學(xué)生就職于國內(nèi)BAT以及海外著名公司。優(yōu)效學(xué)院硼被,名師執(zhí)教示损,高效學(xué)習(xí),成就未來嚷硫。
著:張洋
優(yōu)效學(xué)院_張洋老師
11年工作經(jīng)驗(yàn) 曾就職聯(lián)眾游戲(程序員)检访、眾信旅游(Team Leader)、精智教育(聯(lián)合創(chuàng)始人)论巍、中國石化(大數(shù)據(jù)高級顧問) 精通javaEE體系烛谊、互聯(lián)網(wǎng)產(chǎn)品架構(gòu)风响,熟悉Sap Bw/HANA嘉汰、多個(gè)大數(shù)據(jù)項(xiàng)目經(jīng)驗(yàn)。
20180926版
Java NIO 中的 Channel是什么状勤?有什么特點(diǎn)鞋怀?
Channel:
Java NIO中的SocketChannel是一個(gè)連接到TCP網(wǎng)絡(luò)套接字的通道。
可以通過以下2種方式創(chuàng)建SocketChannel:
1. 打開一個(gè)SocketChannel并連接到互聯(lián)網(wǎng)上的某臺服務(wù)器持搜。
2. 一個(gè)新連接到達(dá)ServerSocketChannel時(shí)密似,會(huì)創(chuàng)建一個(gè)SocketChannel。
打開 SocketChannel 下面是SocketChannel的打開方式:
SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));
關(guān)閉 SocketChannel
當(dāng)用完SocketChannel之后調(diào)用SocketChannel.close()關(guān)閉SocketChannel:
socketChannel.close();
從 SocketChannel 讀取數(shù)據(jù)
要從SocketChannel中讀取數(shù)據(jù)葫盼,調(diào)用一個(gè)read()的方法之一残腌。
ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = socketChannel.read(buf);
非阻塞模式
可以設(shè)置 SocketChannel 為非阻塞模式(non-blocking mode).設(shè)置之后,就可以在異步模式下調(diào)用connect(), read() 和write()了贫导。
如果SocketChannel在非阻塞模式下抛猫,此時(shí)調(diào)用connect(),該方法可能在連接建立之前就返回了孩灯。為了確定連接是否建立闺金,可以調(diào)用finishConnect()的方法。
像這樣:
socketChannel.configureBlocking(false);
socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));
while(! socketChannel.finishConnect() ){
//wait, or do something else...
}
Java NIO Channel通道和流非常相似峰档,主要有以下幾點(diǎn)區(qū)別:
·?通道可以讀也可以寫败匹,流一般來說是單向的(只能讀或者寫寨昙,所以之前我們用流進(jìn)行IO操作的時(shí)候需要分別創(chuàng)建一個(gè)輸入流和一個(gè)輸出流)。
·?通道可以異步讀寫掀亩。
·?通道總是基于緩沖區(qū)Buffer來讀寫舔哪。
Java NIO中最重要的幾個(gè)Channel的實(shí)現(xiàn):
·?FileChannel: 用于文件的數(shù)據(jù)讀寫
·?DatagramChannel: 用于UDP的數(shù)據(jù)讀寫
·?SocketChannel: 用于TCP的數(shù)據(jù)讀寫,一般是客戶端實(shí)現(xiàn)
·?ServerSocketChannel: 允許我們監(jiān)聽TCP鏈接請求归榕,每個(gè)請求會(huì)創(chuàng)建會(huì)一個(gè)SocketChannel尸红,一般是服務(wù)器實(shí)現(xiàn)
類層次結(jié)構(gòu)
本文章為連載內(nèi)容,大家可以持續(xù)關(guān)注小編刹泄,我將盡其所能的為大家提供技術(shù)性實(shí)踐資料外里、文章、視頻特石。
感謝大家的支持盅蝗!