【代碼練習7】UPD協議傳輸練習

UDP協議

User Datagram Protocol,縮寫爲UDP,又稱用戶數據報文協議,是一個簡單的面向數據報的傳輸層協議。

UDP只提供數據的不可靠傳遞,它一旦把應用程序發給網絡層的數據發送出去,就不保留數據備份(所以UDP有時候也被認爲是不可靠的數據報協議)。

UDP在IP數據報的頭部僅僅加入了複用和數據校驗(字段)。由於缺乏可靠性且屬於非連接導向協議,UDP應用一般必須允許一定量的丟包、出錯。流媒體(流技術)、即時多媒體遊戲和IP電話(VoIP)一定就是典型的UDP應用。如果某個應用需要很高的可靠性,那麼可以用傳輸控制協議(TCP協議)來代替UDP。

1. 發送端代碼

import java.net.*;


//發送端
public class UDPSenderTest {
    public static void main(String[] args) throws Exception {
        //先創建套接字本地地址
        InetSocketAddress addr = new InetSocketAddress("localhost",8888);
        //將該地址綁定到套接字
        DatagramSocket socket = new DatagramSocket(addr);

        for (int i = 1;;i++){
            //創建要發送的字符串數組
            byte[] buf = ("你好,在嗎? +" + i).getBytes();
            InetSocketAddress receiverAddr = new InetSocketAddress("localhost",9999);
            //創建該字符數組的數據報報包,並指定目標地址和目標端口
            DatagramPacket packet = new DatagramPacket(buf,0,buf.length,receiverAddr);
            //從socket套接字發送packet數據報包
            socket.send(packet);
            Thread.sleep(1000);//Thread類繼承java.lang.Object,可以直接調用sleep()方法。
        }
    }
}

2.接受端代碼

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;


//接收端
public class UPDReceiverTest {
    public static void main(String[] args) throws Exception {
        //先創建一個本地端套接字地址,並指定端口號
        InetSocketAddress addr = new InetSocketAddress("localhost",9999);

        //將本地地址綁定到套接字
        DatagramSocket socket = new DatagramSocket(addr);

        //死循環來偵聽接收數據報包
        for (;;){
            //創建一個緩衝區字節數組,因爲構造DatagramPacket,需要傳入字節數組
            byte[] buf = new byte[1024];

            //構造數據報包,用來接收長度爲 length 的包,在緩衝區中指定偏移量爲0。
            DatagramPacket packet = new DatagramPacket(buf ,0, buf.length);

            //從socket套接字接收數據報包。
            socket.receive(packet);

            //獲取數據包寫入字節的長度
            /*(一開始還糾結len爲何不是緩衝區長度,查看API--DatagramPacket類下的getLength()方法
            摘要“返回將要發送或接收到的數據的長度。”也就是說getLength自動返回緩衝區實際接收到的數據長度)*/
            int len = packet.getLength();

            //打印在控制檯
            System.out.println(new String(buf, 0, len));
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章