首页 > 文章列表 > 如何使用Java实现基于UDP协议的网络通信UDP编程?

如何使用Java实现基于UDP协议的网络通信UDP编程?

java UDP
302 2023-05-08

Java怎么实现基于UDP协议的网络通信UDP编程

UDP编程通信

基本介绍

  • 类DatagramSocket和DatagramPacket【数据包/数据报】实现了基于UDP协议网络程序。

  • UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能安全送到目的地,也不确信什么时候可以抵达。

  • DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。

  • UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接。

基本流程

  • 核心的两个类/对象DatagramSocket域DatagramPacket

  • 建立发送端,接收端。

  • 建立数据包

  • 调用DatagramSocket的发送、接收方法

  • 关闭DatagramSocket。

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("发送完毕");

    }

}