【Java】实现UDP通信

news/2024/5/18 12:35:50 标签: udp, java, 网络, websocket, 网络协议

🎈博客主页:🌈我的主页🌈
🎈欢迎点赞 👍 收藏 🌟留言 📝 欢迎讨论!👏
🎈本文由 【泠青沼~】 原创,首发于 CSDN🚩🚩🚩
🎈由于博主是在学小白一枚,难免会有错误,有任何问题欢迎评论区留言指出,感激不尽!🌠个人主页


目录

  • 🌟 一、核心要点
    • 🌟🌟 1.1、TCP与UDP的主要区别
    • 🌟🌟 1.2、Java数据通信UDP编程
    • 🌟🌟 1.3、服务端实现
    • 🌟🌟 1.4、客户端实现
  • 🌟 二、数据通信UDP编程
    • 🌟🌟 2.1、服务端
    • 🌟🌟 2.2、客户端
    • 🌟🌟 2.3、服务器端线程处理类
    • 🌟🌟 2.2、修改服务端


🌟 一、核心要点

🌟🌟 1.1、TCP与UDP的主要区别

TCP—传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。UDP—用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

🌟🌟 1.2、Java数据通信UDP编程

UDP协议(用户数据报协议)是无连接的、不可靠的、无序的,速度快
进行数据传输时,首先将要传输的数据定义成数据报(Datagram),大小限制在64k,在数据报中指明数据索要达到的Socket(主机地址和端口号),然后再将数据报发送出去
DatagramPacket类:表示数据报包
DatagramSocket类:进行端到端通信的类

🌟🌟 1.3、服务端实现

① 创建DatagramSocket,指定端口号
② 创建DatagramPacket
③ 接受客户端发送的数据信息
④ 读取数据

🌟🌟 1.4、客户端实现

① 定义发送信息
② 创建DatagramPacket,包含将要发送的信息
③ 创建DatagramSocket
④ 发送数据

🌟 二、数据通信UDP编程

🌟🌟 2.1、服务端

java">public class UDPServer {
    public static void main(String[] args) throws IOException {
        /*
         * 接收客户端发送的数据
         */
        //1.创建服务器端DatagramSocket,指定端口
        DatagramSocket socket=new DatagramSocket(9876);
        //2.创建数据报,用于接收客户端发送的数据
        byte[] data =new byte[1024];//创建字节数组,指定接收的数据包的大小
        DatagramPacket packet=new DatagramPacket(data, data.length);
        //3.接收客户端发送的数据
        socket.receive(packet);//此方法在接收到数据报之前会一直阻塞
        //4.读取数据
        String info=new String(data, 0, packet.getLength());
        System.out.println("我是服务器,客户端说:"+info);

        /*
         * 向客户端响应数据
         */
        //1.定义客户端的地址、端口号、数据
        InetAddress address=packet.getAddress();
        int port=packet.getPort();
        byte[] data2="欢迎您!".getBytes();
        //2.创建数据报,包含响应的数据信息
        DatagramPacket packet2=new DatagramPacket(data2, data2.length, address, port);
        //3.响应客户端
        socket.send(packet2);
        //4.关闭资源
        socket.close();
    }
}

🌟🌟 2.2、客户端

java">public class UDPClient {
    public static void main(String[] args) throws IOException {
        /*
         * 向服务器端发送数据
         */
        //1.定义服务器的地址、端口号、数据
        InetAddress address=InetAddress.getByName("localhost");
        int port=9876;
        byte[] data="用户名:jinbin;密码:1997".getBytes();
        //2.创建数据报,包含发送的数据信息
        DatagramPacket packet=new DatagramPacket(data, data.length, address, port);
        //3.创建DatagramSocket对象
        DatagramSocket socket=new DatagramSocket();
        //4.向服务器端发送数据报
        socket.send(packet);

        /*
         * 接收服务器端响应的数据
         */
        //1.创建数据报,用于接收服务器端响应的数据
        byte[] data2=new byte[1024];
        DatagramPacket packet2=new DatagramPacket(data2, data2.length);
        //2.接收服务器响应的数据
        socket.receive(packet2);
        //3.读取数据
        String reply=new String(data2, 0, packet2.getLength());
        System.out.println("我是客户端,服务器说:"+reply);
        //4.关闭资源
        socket.close();
    }
}

实现了服务端与单个客户端的通信

🌟🌟 2.3、服务器端线程处理类

java">public class UDPServerThread extends Thread{
    DatagramPacket packet;
    DatagramSocket socket;

    public UDPServerThread(DatagramPacket packet, DatagramSocket socket) {
        super();
        this.packet = packet;
        this.socket = socket;
    }

    @Override
    public void run(){
        try {
            //获取客户端信息
            byte[] data = packet.getData();
            String info1 = new String(data, 0, packet.getLength());
            System.out.println("我是服务器,客户端说:" + info1);
            //响应客户端
            InetAddress address = packet.getAddress();
            int port = packet.getPort();
            byte[] data1 = "欢迎您!".getBytes();
            DatagramPacket packet1 = new DatagramPacket(data1, data1.length, address, port);
            socket.send(packet1);
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}

🌟🌟 2.2、修改服务端

java">public class UDPServer {
    public static void main(String[] args) throws IOException {
        /*
         * 接收客户端发送的数据
         */
        //1.创建服务器端DatagramSocket,指定端口
        DatagramSocket socket=new DatagramSocket(8800);
        //2.创建数据报,用于接收客户端发送的数据
        byte[] data =new byte[1024];//创建字节数组,指定接收的数据包的大小
        System.out.println("****服务器启动,等待客户端连接****");
        int count=1;
        while(true) {
            DatagramPacket packet = new DatagramPacket(data, data.length);
            socket.receive(packet);
            UDPServerThread serverThread = new UDPServerThread(packet, socket);
            serverThread.start();
            System.out.println("客户端数量:" + count++);
        }
    }
}

注意:UDP多个客户端通信的时候socket是不关闭的,我也试过关闭的话
会出异常Exception in thread "main" java.net.SocketException: socket closed,因为在UDPServer类的while是死循环,无法重新创建socket,所以这里不能关闭socket,否则无法进行下一个客户端的监听


http://www.niftyadmin.cn/n/303504.html

相关文章

李沐论文精度系列之十:GPT-4

文章目录 一、AIGC资讯速览1.1 Toolformer(2023.2.9)1.2 ChatGPT plugin1.3 LLaMA(2023.2.24)1.4 Visual ChatGPT(2023.3.8)1.5 GigaGAN(2023.3.9)1.6 Stanford Alpaca(2…

NVIDIA CUDA驱动安装

1 引言 因为笔记本电脑上运行Milvus图像检索代码,需要安装CUDA驱动。电脑显卡型号是NVIDIA GeForce GTX 1050 Ti Mobile, 操作系统是Ubuntu 20.04,内核版本为Linux 5.15.0-72-generic。 2 CUDA驱动测试 参考网上的资料:https://blog.csdn.…

flutter系列之:做一个修改组件属性的动画

文章目录 简介flutter中的动画widgetAnimatedContainers使用举例总结 简介 什么是动画呢?动画实际上就是不同的图片连续起来形成的。flutter为我们提供了一个AnimationController来对动画进行详尽的控制,不过直接是用AnimationController是比较复杂的&a…

Line Renderer组件

介绍 Line Renderer 是 Unity 中的一个组件,它可以在场景中绘制直线、曲线或者折线等形状。它通常用于绘制轨迹、路径、线段等图形。Line Renderer 可以通过调整不同的属性来控制线的宽度、颜色、材质、坐标等方面,从而实现各种不同的效果。 方法 Set…

openEuler 社区 2023 年 4 月运作报告

概述 过去一个月,openEuler社区全员参与openEuler Developer Day 2023,通过SIG组开放工作会议完成了下个版本的规划。openEuler社区也参加了在新加坡举办的FOSSASIA SUMMIT。 在技术层面,社区不断推进创新,发布新项目&#xff0…

API 接口的使用和功能

随着互联网的快速发展,API接口已经成为了现代开发中不可或缺的一部分。API接口可以让你的应用程序与其他应用程序、系统或服务进行数据交流和集成。如果你正在开发应用程序,那么最好的方法就是使用API接口来增强功能和性能。 我们的API接口是为您的应用…

rk3568 修改开机logo

rk3568 修改开机显示logo Android 显示 logo 的作用是为了标识应用程序或设备的品牌和身份。在应用程序中,logo 可以帮助用户快速识别应用程序,并与其他应用程序区分开来。在设备中,logo 可以帮助用户识别设备的品牌和型号,以及与…

【标准化方法】(3) Group Normalization 原理解析、代码复现,附Pytorch代码

今天和各位分享一下深度学习中常用的标准化方法,Group Normalization 数据分组归一化,向大家介绍一下数学原理,并用 Pytorch 复现。 Group Normalization 论文地址:https://arxiv.org/pdf/1803.08494.pdf 1. 原理介绍 在目标检测…