首頁 >Java >java教程 >Java怎麼實作基於UDP協定的網路通訊UDP編程

Java怎麼實作基於UDP協定的網路通訊UDP編程

王林
王林轉載
2023-05-17 13:13:471259瀏覽

UDP程式通訊

基本介紹

  • 類別DatagramSocket和DatagramPacket【資料包/資料封包】實作了基於UDP協定網路程式。

  • UDP資料封包透過資料報套接字DatagramSocket發送和接收,系統不保證UDP資料封包一定能安全送到目的地,也不確信何時可以抵達。

  • DatagramPacket物件封裝了UDP資料報,在資料封包中包含了發送端的IP位址和連接埠號碼以及接收端的IP位址和連接埠號碼。

  • UDP協定中每個資料封包都給出了完整的位址訊息,因此無須建立傳送者和接收者的連線。

基本流程

  • 核心的兩個類別/物件DatagramSocket域DatagramPacket

  • ##以建立傳送端,接收端。

  • 建立封包

  • 呼叫DatagramSocket的傳送、接收方法

  • 關閉DatagramSocket。

UDP網路程式設計原理示意圖

Java怎麼實作基於UDP協定的網路通訊UDP編程

#UDP說明:

  • 沒有明確的服務端和客戶端,演變成資料的傳送端和接收端。

  • 接收資料和發生資料是透過DatagramSocket物件完成。

  • 將資料封裝到DatagramPacket物件/包裝包。

  • 當接收到DatagramPacket對象,需要進行拆包,取出資料

  • DatagramSocket可以指定在哪個連接埠接收資料。

  • package com.study.srv.demo18;
    import java.io.IOException;
    import java.net.*;
    /**
     * @version 1.0
     * UDP发送端
     */
    public class Demo11 {
        public static void main(String[] args) throws IOException {
            //1.创建DatagramSocket对象,准备发送和接收数据,在9998端口接收
            DatagramSocket datagramSocket = new DatagramSocket(9998);
            //2.将需要发送的数据,封装到DatagramPacket对象
            String s="发送的数据";
            byte[] buf=s.getBytes();
            InetAddress ip = InetAddress.getByName("192.168.0.18");
            //说明:封装的DatagramPacket对象
            //buf 内容字节数组
            //buf.length 数据长度
            //ip 主机(ip)
            //9999 端口
            DatagramPacket packet = new DatagramPacket(buf, buf.length, ip, 9999);
            //发送数据
            datagramSocket.send(packet);
            //关闭资源
    //        datagramSocket.close();
            System.out.println("发送完毕");
            //发送端变为接收端接收数据
            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("接受结束");
        }
    }
    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.创建一个 DatagramSocket对象,准备在9999接收数据
            DatagramSocket datagramSocket = new DatagramSocket(9999);
            //2.构建一个DatagramPacket 对象,准备接收数据
            //在UDP协议,一个数据包最大64k
            byte[] buf=new byte[1024];
            DatagramPacket packet = new DatagramPacket(buf, buf.length);
            //3.接收方法 将通过网络传输的DatagramPacket对象填充到packet里去。
            System.out.println("接收端等待接收");
            datagramSocket.receive(packet);
            //4.可以对packet进行拆包,取出数据,并显示
            //实际接收到的数据字节长度
            int length = packet.getLength();
            //实际接收到的数据
            byte[] data = packet.getData();
            String string = new String(data, 0, length);
            System.out.println(string);
            //5.关闭资源
    //        datagramSocket.close();
            System.out.println("接收结束");
            //接收端变为发送端,发送数据
            String s="接收端变为发送端,发送数据";
            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("发送完毕");
        }
    }

以上是Java怎麼實作基於UDP協定的網路通訊UDP編程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除