UDP:
UDP是數(shù)據(jù)報文傳輸協(xié)議威兜,這個傳輸協(xié)議比較野蠻,發(fā)送端不需要理會接收端是否存在旅挤,直接就發(fā)送數(shù)據(jù)礼华,不會像TCP協(xié)議一樣建立連接。如果接收端不存在的話戏售,發(fā)送的數(shù)據(jù)就會丟失侨核,UDP協(xié)議不會去理會數(shù)據(jù)的安全性,而且在網(wǎng)絡(luò)繁忙灌灾、堵塞的時候會丟失一些數(shù)據(jù)搓译,俗稱“丟包”。
但是UDP協(xié)議的傳輸速度很快锋喜,基本是你的網(wǎng)絡(luò)有多快就傳輸多快些己。所以游戲、直播嘿般、語音電話等功能都是得靠UDP來實現(xiàn) 段标,TCP都是基于UDP開發(fā)的,就是在UDP上增加了各種安全措施保護了數(shù)據(jù)的安全炉奴,犧牲了傳輸?shù)乃俣取?UDP傳輸數(shù)據(jù)的方式是把數(shù)據(jù)分成一個個的數(shù)據(jù)包逼庞,每個包都會限制數(shù)據(jù)的大小。
學習UDP的傳輸瞻赶,我們需要用到兩個類:DatagramSocket和DatagramPacket類赛糟,和TCP里學過的不一樣的一點是DatagramSocket既可以做接收端派任,也可以做發(fā)送端。接收端需要聲明端口號璧南,發(fā)送端則不需要聲明ip地址和端口號掌逛。接收端會有一個空的數(shù)據(jù)包,用來接存儲發(fā)送端發(fā)過來的數(shù)據(jù)司倚。發(fā)送端則是將數(shù)據(jù)包裝成一個數(shù)據(jù)包豆混,然后聲明對方的ip地址和端口號接著就能將數(shù)據(jù)發(fā)送過去了。示意圖:
發(fā)送端代碼示例:
接收端也可以限制IP的对湃,設(shè)置成只接收某個IP的數(shù)據(jù):
接收端代碼示例:
運行結(jié)果:
到此之前我們編寫的都是單線程的服務(wù)器端崖叫,單線程的服務(wù)器有一個壞處就是,在多人同時訪問的時候會很緩慢拍柒。例如做個試驗:在單線程的服務(wù)器端調(diào)用sleep方法讓線程休眠3秒鐘,然后運行服務(wù)器端屈暗,接著打開幾個瀏覽器同時進行訪問拆讯,會發(fā)現(xiàn)第一個瀏覽器停頓了3秒左右,第二個瀏覽器停頓了6秒左右养叛,第三個瀏覽器停頓了9秒左右种呐,這樣以此類推的話速度實在太慢不忍直視。所以這時候就需要用到多線程來編寫多線程服務(wù)器了弃甥,多線程就能同時的進行處理訪問的客戶端爽室,而且在真正的開發(fā)中也不可能會用到單線程的服務(wù)器。
TCP多線程服務(wù)器代碼示例:
運行結(jié)果:
UDP多線程服務(wù)器代碼示例:
運行結(jié)果:
從運行結(jié)果可以看出來這種來一個線程開一個線程的方式的弊端淆攻,就是會開啟無數(shù)個線程阔墩,導致資源占用很大。
線程池服務(wù)器: 所以這時候我們就需要用到線程池了瓶珊,線程池能很好的管理線程資源啸箫,能夠限制住不會導致資源占用很大。 TCP線程池服務(wù)器代碼示例:
運行結(jié)果:
UDP線程池服務(wù)器代碼示例:
運行結(jié)果:
從運行結(jié)果可以看出伞芹,使用線程池能夠控制好線程的開啟數(shù)量忘苛,從而不會導致線程的濫用,在計算機上的資源占用也就不會那么嚴重了唱较。在開發(fā)中盡量使用線程池來編寫多線程服務(wù)器扎唾,不使用線程池的話弊端很大。