1.什么是阻塞和非阻塞?什么是同步和異步?
阻塞和非阻塞:
從線程的角度考慮 ,線程掛起 不在搶奪CPU 則稱為線程被阻塞 同步和異步:
任務(wù)的執(zhí)行需要相互等待、相互協(xié)調(diào)為同步;各執(zhí)行各的,不管其他人,是異步。
2.解釋一下什么是NIO?
是jdk1.4出現(xiàn)同步非阻塞式IO,它可以實(shí)現(xiàn)面向通道操作緩沖區(qū),雙向的傳遞數(shù)據(jù),它適合在高并發(fā)的情況下使用,可以實(shí)現(xiàn)少量的線程為多個客戶端服務(wù)。
3.NIO和IO有什么區(qū)別?
1) BIO: 面向流,操作字節(jié)字符,具有方向性,同步阻塞式IO 比喻:水管 InputStream OutputStream Reader Writer
2)NIO: 面向通道,操作緩沖區(qū),可以雙向傳輸數(shù)據(jù),同步非阻塞式IO 比喻:地下通道 Channel Buffer Selector
4.NIO的常用API?
要實(shí)現(xiàn)NIO,主要就是操作它的三個API;
1)Channel 通道 可以實(shí)現(xiàn)雙向傳輸數(shù)據(jù)
既能讀,又能寫,在使用的時候需要調(diào)用方法將其設(shè)置為false,即非阻塞模式;它有很多的實(shí)現(xiàn)類:
2)Buffer 緩沖區(qū)
在內(nèi)存中開辟一段連續(xù)的空間,用于存儲臨時的數(shù)據(jù)。
常用的ByteBuffer,和CharBuffer,還有其它的用于不同的數(shù)據(jù)類型
所有的buffer都是抽象類,無法被直接實(shí)例化;
緩沖區(qū)的數(shù)據(jù)存放在內(nèi)存中,能提高讀寫效率;
緩沖區(qū)有指針記錄,能改變讀寫數(shù)據(jù)的起始點(diǎn),處理靈活;
Buffer有幾個基本的屬性:capacity、Position、Limit、Mark
緩沖區(qū)常用的方法:清除/反轉(zhuǎn)/環(huán)繞/存放/取/存
3)Selector 選擇器
多個客戶端在Selector中注冊自己,多個通道注冊到Selector中,通過選擇操作選出就緒的鍵,通道線程來實(shí)現(xiàn)少量線程的為多個客戶端服務(wù)
用到的一些方法:
5.什么是網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)恼嘲鼏栴}?
數(shù)據(jù)包之間發(fā)生的粘連問題,網(wǎng)絡(luò)分為7層,每層負(fù)責(zé)每層的任務(wù), TCP不理解應(yīng)用層傳輸過來的數(shù)據(jù)
由于TCP傳輸是一種可靠的連續(xù)的數(shù)據(jù)傳輸,如果兩次傳輸?shù)臄?shù)據(jù)時間間隔比較短,數(shù)據(jù)的接收方可能很難判斷出兩次數(shù)據(jù)的邊界在哪里,感覺就好像兩個數(shù)據(jù)黏著在了一次,無法區(qū)分。
粘包問題常用的解決辦法:
1)每次傳輸固定大小的數(shù)據(jù),存在資源浪費(fèi),缺乏靈活性
2)約定分隔符,如果符號相同,轉(zhuǎn)義一下,需要解析,不是很好
3)使用協(xié)議,雙方約定好
使用公開協(xié)議,或者私有的協(xié)議
在傳輸?shù)倪^程中,先傳遞長度信息,在根據(jù)長度信息獲取數(shù)據(jù)
6.IO圖1
7.IO圖2
推薦一篇好文章https://www.cnblogs.com/xiaoxi/p/6576588.html
更多建議: