首页 > 编程语言 >有趣的Java之网络多线程——UDP编程

有趣的Java之网络多线程——UDP编程

时间:2023-11-05 10:37:14浏览次数:37  
标签:DatagramSocket datagramSocket UDP DatagramPacket Java 发送 new 多线程

有趣的Java之网络多线程——UDP编程_接收端

UDP编程通信

基本介绍

  1. 类DatagramSocket和DatagramPacket【数据包/数据报】实现了基于UDP协议网络程序。
  2. UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能安全送到目的地,也不确信什么时候可以抵达。
  3. DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。
  4. UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接。

基本流程

  1. 核心的两个类/对象DatagramSocket域DatagramPacket
  2. 建立发送端,接收端。
  3. 建立数据包
  4. 调用DatagramSocket的发送、接收方法
  5. 关闭DatagramSocket。

UDP网络编程原理示意图

有趣的Java之网络多线程——UDP编程_数据_02

UDP说明:

  • 没有明确的服务端和客户端,演变成数据的发送端和接收端。
  • 接收数据和发生数据是通过DatagramSocket对象完成。
  • 将数据封装到DatagramPacket对象/装包。
  • 当接收到DatagramPacket对象,需要进行拆包,取出数据
  • DatagramSocket可以指定在哪个端口接收数据。
package com.study.srv.demo18;


import java.io.IOException;
import java.net.*;

/**
 * @author Wen先森
 * @version 1.0
 * @date 2022/7/18 14:03
 * 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;

/**
 * @author Wen先森
 * @version 1.0
 * @date 2022/7/18 14:03
 *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("发送完毕");
    }
}

标签:DatagramSocket,datagramSocket,UDP,DatagramPacket,Java,发送,new,多线程
From: https://blog.51cto.com/wen3/8189396

相关文章

  • 一文读懂ReentrantLock在多线程编程中的作用和优点
    引言在当今这个数字化时代,软件开发已经离不开多线程编程。但是,多线程编程也带来了一系列复杂性和挑战,其中最关键的一个问题就是线程同步和互斥。为了应对这个问题,Java语言提供了一些工具,其中最强大的工具之一就是ReentrantLock。本文将对ReentrantLock进行深入探讨,介绍它在多线程编......
  • 【趣味Javascript】前端开发中不为人知的LHS和RHS查询,你真的弄明白了吗? 《1024程序
    ......
  • 推荐一些socket工具,TCP、UDP调试、抓包工具
    推荐一些socket工具,TCP、UDP调试、抓包工具https://www.cnblogs.com/porter/p/7838753.html如何使用TCP|UDPSOCKET调试工具联机超高频读卡器HXU7881-6DBI/IPhttps://zhuanlan.zhihu.com/p/648752372?utm_id=0......
  • java常用类
    java常用类autoCloseAble接口 1.内部类,2.Object类,3.Object类常用用法,4包装类,5.String类,6.BigDecimal类内部类:1.成员内部类;在一个类中再定义一个类,作为前一个类的成员存在;2.静态内部类;在成员内部类的基础上加static;3.局部内部类;把一个类定义在一个方法内部;访问局部变量......
  • java 类和对象以及封装
    封装对象代表什么,就得封装对应的数据,并提供数据对应的行为......
  • 前端学习-JavaScrip学习-js基础01
    学习教程:黑马程序员视频链接JS简介JS组成JavaScrip=ECMAscript(语言基础)+webAPIwebAPI=BOM+DOM资料查询网站:MDN<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="......
  • Java八股面试整理(4)
    34.遇到过异常吗,如何处理?在Java中,可以按照如下三个步骤处理异常:捕获异常将业务代码包裹在try块内部,当业务代码中发生任何异常时,系统都会为此异常创建一个异常对象。创建异常对象之后,JVM会在try块之后寻找可以处理它的catch块,并将异常对象交给这个catch块处理。处理异常在......
  • 深入研究synchronized:解锁高效多线程编程的秘诀
    大家好,我是老七,点个关注吧,将持续更新更多精彩内容!在Java的多线程编程里,让多个线程能够安全、高效地协同工作是非常重要的。而synchronized这个关键字,就是一个很重要的工具,可以帮助我们实现多线程同步。本文会深入讨论synchronized的作用、使用方法、工作原理,以及它和其他锁机制的比......
  • 每天5道Java面试题(第二天)
    1. JDK和JRE有什么区别?JDK:JavaDevelopmentKit的简称,Java开发工具包,提供了Java的开发环境和运行环境。JRE:JavaRuntimeEnvironment的简称,Java运行环境,为Java的运行提供了所需环境。具体来说JDK其实包含了JRE,同时还包含了编译Java源码的编译器Javac,还包含了很多J......
  • Java学习—对象和类
    对象&类对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。类:类是一个模板,它描述一类对象的行为和状态。java命名约定的优点通过使用标准的Java命名约定,您可以使自己和其他程序员更容易阅读代码。Jav......