UDP協議發包的使用(DatagramSocket、DatagramPacket)

在有些應用程序中,保持最快的速度比保證每一位數據都正確到達更重要。例如,在實時音頻或視頻中,丟失數據包只會做爲干擾出現。干擾是能夠容忍的,但當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

相關文章
相關標籤/搜索