溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java怎么實(shí)現(xiàn)基于UDP協(xié)議的網(wǎng)絡(luò)通信UDP編程

發(fā)布時(shí)間:2023-04-27 10:33:48 來源:億速云 閱讀:115 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Java怎么實(shí)現(xiàn)基于UDP協(xié)議的網(wǎng)絡(luò)通信UDP編程”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“Java怎么實(shí)現(xiàn)基于UDP協(xié)議的網(wǎng)絡(luò)通信UDP編程”文章能幫助大家解決問題。

UDP編程通信

基本介紹

  • 類DatagramSocket和DatagramPacket【數(shù)據(jù)包/數(shù)據(jù)報(bào)】實(shí)現(xiàn)了基于UDP協(xié)議網(wǎng)絡(luò)程序。

  • UDP數(shù)據(jù)報(bào)通過數(shù)據(jù)報(bào)套接字DatagramSocket發(fā)送和接收,系統(tǒng)不保證UDP數(shù)據(jù)報(bào)一定能安全送到目的地,也不確信什么時(shí)候可以抵達(dá)。

  • DatagramPacket對象封裝了UDP數(shù)據(jù)報(bào),在數(shù)據(jù)報(bào)中包含了發(fā)送端的IP地址和端口號(hào)以及接收端的IP地址和端口號(hào)。

  • UDP協(xié)議中每個(gè)數(shù)據(jù)報(bào)都給出了完整的地址信息,因此無須建立發(fā)送方和接收方的連接。

基本流程

  • 核心的兩個(gè)類/對象DatagramSocket域DatagramPacket

  • 建立發(fā)送端,接收端。

  • 建立數(shù)據(jù)包

  • 調(diào)用DatagramSocket的發(fā)送、接收方法

  • 關(guān)閉DatagramSocket。

UDP網(wǎng)絡(luò)編程原理示意圖

Java怎么實(shí)現(xiàn)基于UDP協(xié)議的網(wǎng)絡(luò)通信UDP編程

UDP說明:

  • 沒有明確的服務(wù)端和客戶端,演變成數(shù)據(jù)的發(fā)送端和接收端。

  • 接收數(shù)據(jù)和發(fā)生數(shù)據(jù)是通過DatagramSocket對象完成。

  • 將數(shù)據(jù)封裝到DatagramPacket對象/裝包。

  • 當(dāng)接收到DatagramPacket對象,需要進(jìn)行拆包,取出數(shù)據(jù)

  • DatagramSocket可以指定在哪個(gè)端口接收數(shù)據(jù)。

package com.study.srv.demo18;
import java.io.IOException;
import java.net.*;
/**
 * @version 1.0
 * UDP發(fā)送端
 */
public class Demo11 {
    public static void main(String[] args) throws IOException {
        //1.創(chuàng)建DatagramSocket對象,準(zhǔn)備發(fā)送和接收數(shù)據(jù),在9998端口接收
        DatagramSocket datagramSocket = new DatagramSocket(9998);
        //2.將需要發(fā)送的數(shù)據(jù),封裝到DatagramPacket對象
        String s="發(fā)送的數(shù)據(jù)";
        byte[] buf=s.getBytes();
        InetAddress ip = InetAddress.getByName("192.168.0.18");
        //說明:封裝的DatagramPacket對象
        //buf 內(nèi)容字節(jié)數(shù)組
        //buf.length 數(shù)據(jù)長度
        //ip 主機(jī)(ip)
        //9999 端口
        DatagramPacket packet = new DatagramPacket(buf, buf.length, ip, 9999);
        //發(fā)送數(shù)據(jù)
        datagramSocket.send(packet);
        //關(guān)閉資源
//        datagramSocket.close();
        System.out.println("發(fā)送完畢");
        //發(fā)送端變?yōu)榻邮斩私邮諗?shù)據(jù)
        byte[] bytes = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
        datagramSocket.receive(datagramPacket);
        int length = datagramPacket.getLength();
        byte[] data = datagramPacket.getData();
        String string = new String(data, 0, length);
        System.out.println(string);
        datagramSocket.close();
        System.out.println("接受結(jié)束");
    }
}
package com.study.srv.demo18;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
 * @version 1.0
 *UDP接收端
 */
public class Demo10 {
    public static void main(String[] args) throws IOException {
        //1.創(chuàng)建一個(gè) DatagramSocket對象,準(zhǔn)備在9999接收數(shù)據(jù)
        DatagramSocket datagramSocket = new DatagramSocket(9999);
        //2.構(gòu)建一個(gè)DatagramPacket 對象,準(zhǔn)備接收數(shù)據(jù)
        //在UDP協(xié)議,一個(gè)數(shù)據(jù)包最大64k
        byte[] buf=new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
        //3.接收方法 將通過網(wǎng)絡(luò)傳輸?shù)腄atagramPacket對象填充到packet里去。
        System.out.println("接收端等待接收");
        datagramSocket.receive(packet);
        //4.可以對packet進(jìn)行拆包,取出數(shù)據(jù),并顯示
        //實(shí)際接收到的數(shù)據(jù)字節(jié)長度
        int length = packet.getLength();
        //實(shí)際接收到的數(shù)據(jù)
        byte[] data = packet.getData();
        String string = new String(data, 0, length);
        System.out.println(string);
        //5.關(guān)閉資源
//        datagramSocket.close();
        System.out.println("接收結(jié)束");
        //接收端變?yōu)榘l(fā)送端,發(fā)送數(shù)據(jù)
        String s="接收端變?yōu)榘l(fā)送端,發(fā)送數(shù)據(jù)";
        byte[] bytes=s.getBytes();
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("192.168.0.18"), 9998);
        datagramSocket.send(datagramPacket);
        datagramSocket.close();
        System.out.println("發(fā)送完畢");
    }
}

關(guān)于“Java怎么實(shí)現(xiàn)基于UDP協(xié)議的網(wǎng)絡(luò)通信UDP編程”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI