UDP:
UDP是數據報文傳輸協議,這個傳輸協議比較野蠻,發送端不需要理會接收端是否存在,直接就發送數據,不會像TCP協議一樣建立連接。如果接收端不存在的話,發送的數據就會丟失,UDP協議不會去理會數據的安全性,而且在網絡繁忙、堵塞的時候會丟失一些數據,俗稱“丟包”。
但是UDP協議的傳輸速度很快,基本是你的網絡有多快就傳輸多快。所以游戲、直播、語音電話等功能都是得靠UDP來實現 ,TCP都是基於UDP開發的,就是在UDP上增加了各種安全措施保護了數據的安全,犧牲了傳輸的速度。 UDP傳輸數據的方式是把數據分成一個個的數據包,每個包都會限制數據的大小。
學習UDP的傳輸,我們需要用到兩個類:DatagramSocket和DatagramPacket類,和TCP里學過的不一樣的一點是DatagramSocket既可以做接收端,也可以做發送端。接收端需要聲明端口號,發送端則不需要聲明ip地址和端口號。接收端會有一個空的數據包,用來接存儲發送端發過來的數據。發送端則是將數據包裝成一個數據包,然后聲明對方的ip地址和端口號接着就能將數據發送過去了。 示意圖:
發送端代碼示例:
接收端也可以限制IP的,設置成只接收某個IP的數據:
接收端代碼示例:
運行結果:
多線程服務器:
到此之前我們編寫的都是單線程的服務器端,單線程的服務器有一個壞處就是,在多人同時訪問的時候會很緩慢。例如做個試驗:在單線程的服務器端調用sleep方法讓線程休眠3秒鍾,然后運行服務器端,接着打開幾個瀏覽器同時進行訪問,會發現第一個瀏覽器停頓了3秒左右,第二個瀏覽器停頓了6秒左右,第三個瀏覽器停頓了9秒左右,這樣以此類推的話速度實在太慢不忍直視。所以這時候就需要用到多線程來編寫多線程服務器了,多線程就能同時的進行處理訪問的客戶端,而且在真正的開發中也不可能會用到單線程的服務器。
TCP多線程服務器代碼示例:
運行結果:
UDP多線程服務器代碼示例:
運行結果:
從運行結果可以看出來這種來一個線程開一個線程的方式的弊端,就是會開啟無數個線程,導致資源占用很大。
線程池服務器: 所以這時候我們就需要用到線程池了,線程池能很好的管理線程資源,能夠限制住不會導致資源占用很大。 TCP線程池服務器代碼示例:
運行結果:
UDP線程池服務器代碼示例:
運行結果:
從運行結果可以看出,使用線程池能夠控制好線程的開啟數量,從而不會導致線程的濫用,在計算機上的資源占用也就不會那么嚴重了。在開發中盡量使用線程池來編寫多線程服務器,不使用線程池的話弊端很大。