在有些應用程序中,保持最快的速度比保證每一位數據都正確到達更重要。例如,在實時音頻或視頻中,丟失數據包只會做爲干擾出現。干擾是能夠容忍的,但當TCP請求重傳或等待數據包到達而它卻遲遲不到時,音頻流中就會出現尷尬的停頓,這讓人沒法接受的。在其餘應用中,能夠在應用層實現可靠性傳輸。例如:若是客戶端向服務器發送一個短的UDP請求,假若制定時間內沒有響應返回,它會認爲這個包已丟失。域名系統就是採用這樣的工做方式。事實上,能夠用UDP實現一個可靠的文件傳輸協議,並且不少人確實是這樣作的:網絡文件系統,簡單FTP都使用了UDP協議。在這些協議中由應用程序來負責可靠性。java中的UDP實現分爲兩個類:DatagramPacket和 DatagramSocket。DatagramPacket類將數據字節填充到UDP包中,這稱爲數據報。 DatagramSocket來發送這個包。要接受數據,能夠從DatagramSocket中接受一個 DatagramPack對象,而後從該包中讀取數據的內容。java
這種職責的劃分與TCP使用的Socket和ServerSocket有所不一樣。首先,UDP沒有兩臺主機間惟一鏈接的概念,它不須要知道對方是哪一個遠程主機。它能夠從一個端口往多個主機發送信息,可是TCP是沒法作到的。其次,TCP socket把網絡連接看做是流:經過從Socket獲得的輸入和輸出流來收發數據。UDP不支持這一點,你處理老是單個數據包。填充在一個數據報中的全部數據會以包的形式進行發送,這些數據要麼做爲一個組要麼所有接收,要麼所有丟棄。一個包不必定與下一個包相關。給定兩個包,沒有辦法知道哪一個先發哪一個後發。對於流來講,必須提供數據的有序隊列,與之不一樣,數據報會盡量快的蜂擁到接收方。服務器
--------------------------------------------------------------------------------------------------------------------------------------------網絡
一、UDP 是User Datagram Protocol的簡稱, 中文名是用戶數據報協議,是OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種無鏈接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務,IETF RFC 768是UDP的正式規範。UDP在IP報文的協議號是17。socket
二、與所熟知的TCP(傳輸控制協議)協議同樣,UDP協議直接位於IP(網際協議)協議的頂層。根據OSI(開放系統互連)參考模型,UDP和TCP都屬於傳輸層協議。UDP協議的主要做用是將網絡數據流量壓縮成數據包的形式。一個典型的數據包就是一個二進制數據的傳輸單位。每個數據包的前8個字節用來包含報頭信息,剩餘字節則用來包含具體的傳輸數據。ide
三、實現過程測試
1)發送方spa
public class Client { public static void send(){ try { DatagramSocket socket = new DatagramSocket(); String text = "test"; byte[] buf = text.getBytes(); DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), 9002); socket.send(packet); socket.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { send(); } }
2)接收方線程
public class Server { public void server(){ try { System.out.println("start===================start"); DatagramSocket socket = new DatagramSocket(9002); while(true){ byte[] buf = new byte[2048]; DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); byte[] data = packet.getData(); String msg = new String(data, 0, packet.getLength()); System.out.println(msg); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { new Thread(){ @Override public void run() { Server server = new Server(); server.server(); } }.start(); } }
四、線程:這裏接受方採用啓動一個線程的方式來接受,目的主要是可以循環快捷的接受數據。發送方主要是本身測試數據來實現手動的方式來發送數據
五、UDP的使用很常見,由於使用UDP發包會咋網絡很差的時候出現丟包的狀況,這種方式在遊戲上面應用的很是廣泛,可是不影響具體的體驗。全部如今不少時候都會採用UDP的方式來發送和接受數據。視頻
六、另一點:UDP是不須要創建鏈接的,這種方式也能夠本身來作數據分析,在不是本地實現的方式下,能夠經過這種方式來抓取外部的數據作解析。這樣也不會影響程序的運行,還能夠獲得本身想要的數據。(建議正常使用不要有黑客行爲!)server