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

 更新时间:2023年04月24日 09:13:00   作者:Wen先森  
在Java中使用UDP编程,仍然需要使用Socket,因为应用程序在使用UDP时必须指定网络接口(IP地址)和端口号。注意:UDP端口和TCP端口虽然都使用0~65535,但他们是两套独立的端口,即一个应用程序用TCP占用了端口1234,不影响另一个应用程序用UDP占用端口1234

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

到此这篇关于Java UDP编程的文章就介绍到这了,更多相关Java UDP编程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot实现HTTP调用的7 种方式

    SpringBoot实现HTTP调用的7 种方式

    本文主要介绍了SpringBoot实现HTTP调用的7 种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • 关于使用MyBatis简化JDBC开发和解决SQL语句警告的问题

    关于使用MyBatis简化JDBC开发和解决SQL语句警告的问题

    这篇文章主要介绍了关于使用MyBatis简化JDBC开发和解决SQL语句警告的问题,如果idea和数据库没有建立链接,idea不识别表的信息,就会出现SQL语句的警告,需要的朋友可以参考下
    2023-05-05
  • Maven中dependencyManagement管理项目依赖项

    Maven中dependencyManagement管理项目依赖项

    在开发 Java 项目时,管理和协调依赖项的版本号是一项重要而繁琐的任务,本文主要介绍了Maven中dependencyManagement管理项目依赖项,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • java中BigDecimal类的构造详解及使用

    java中BigDecimal类的构造详解及使用

    这篇文章主要介绍了java中BigDecimal类的构造详解及使用,Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算,需要的朋友可以参考下
    2023-07-07
  • win7下安装 JDK 基本流程

    win7下安装 JDK 基本流程

    这篇文章主要介绍了win7下安装 JDK 基本流程,需要的朋友可以参考下
    2014-05-05
  • Maven deploy plugin使用方式

    Maven deploy plugin使用方式

    这篇文章主要介绍了Maven deploy plugin使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java中TCP通信的实现方法详解

    Java中TCP通信的实现方法详解

    这篇文章主要给大家介绍了关于Java中TCP通信的实现方法,TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server),需要的朋友可以参考下
    2023-09-09
  • java实现24点游戏

    java实现24点游戏

    每次取出4张牌,使用加减乘除,第一个能得出24者为赢,这篇文章主要就为大家详细介绍了java实现24点游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • java实现的小时钟示例分享

    java实现的小时钟示例分享

    这篇文章主要介绍了java实现的小时钟示例,需要的朋友可以参考下
    2014-02-02
  • Java 根据网络URL获取该网页上面所有的img标签并下载图片

    Java 根据网络URL获取该网页上面所有的img标签并下载图片

    这篇文章主要介绍了Java 根据网络URL获取该网页上面所有的img标签并下载图片,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-11-11

最新评论