1.網(wǎng)絡(luò)編程的基本模型是Client/Server模型缤削,也就是2個進(jìn)程之間進(jìn)行相互通信弧腥,其中服務(wù)端提供位置信息(綁定ip地址和監(jiān)聽端口)驻龟,客戶端通過連接操作向服務(wù)端監(jiān)聽地址發(fā)起連接請求看杭,通過3次握手建立連接慨绳,如果連接建立成功,雙方就可以通過網(wǎng)絡(luò)套接字Socket進(jìn)行通信被环。
2.采用BIO模型的服務(wù)端雄卷,通常由一個獨立的Acceptor線程負(fù)責(zé)監(jiān)聽客戶端連接,它接受到客戶端連接請求之后為每個客戶端創(chuàng)建一個新的線程進(jìn)行鏈路處理蛤售,鏈路完成之后丁鹉,通過輸出流返回給客戶端,線程銷毀悴能,這就是一個典型的一對一應(yīng)答通信模型揣钦。
缺點:該模型最大的問題就是缺乏彈性伸縮能力,當(dāng)客戶端并發(fā)訪問量增加后漠酿,服務(wù)端的線程個數(shù)與客戶端的并發(fā)訪問數(shù)呈1:1的正比關(guān)系冯凹,由于Java線程是虛擬機非常寶貴的資源,當(dāng)線程膨脹之后炒嘲,系統(tǒng)性能將急劇下降宇姚,隨著并發(fā)訪問量的繼續(xù)增大,系統(tǒng)會發(fā)生線程堆棧溢出夫凸、創(chuàng)建線程失敗等問題浑劳,并將導(dǎo)致進(jìn)程宕機或僵死,不能對外提供服務(wù)夭拌。
例子:
主線程阻塞在socket.accept()方法上
服務(wù)端輸出結(jié)果:
客戶端輸出結(jié)果:
總結(jié):同步阻塞式IO每當(dāng)一個新的客戶端請求接入時魔熏,服務(wù)端必須創(chuàng)建一個新的線程處理新接入的客戶端連接。在高性能服務(wù)器應(yīng)用領(lǐng)域鸽扁,往往需要成千上萬個客戶端并發(fā)連接蒜绽,這種模型顯然無法滿足高性能、高并發(fā)的場景桶现。