首页 > 其他分享 >UDP通信

UDP通信

时间:2024-09-08 20:52:55浏览次数:13  
标签:UDP DatagramPacket socket 通信 packet new public 客户端

入门

特点:无连接、不可靠 。

不事先建立连接,数据按照包发,一包数据包括:自己的IP、程序端口,目的地IP、程序端口和数据(限制在64K内)等。

发送方不管对方是否在线,数据在中间丢失也不管,如果接收方收到数据也不会确认,故是不可靠的。

Java提供了一个java.net.DatagramSocket类来实现UDP通信。

UDP通信_数据

 客户端

public class Client {
    public static void main(String[] args) throws Exception {
        // 1. 创建客户端对象(发报出去的人)
        DatagramSocket socket = new DatagramSocket();

        // 2. 创建数据包对象把要发送出去的数据打包(创建一个信差搬运子)
        /* public DatagramPacket(byte buf[], int length, InetAddress address, int port)
           参数一:封装要发送的数据。
           参数二:发送出去的数据大小(字节数组)。
           参数三:服务器的IP地址(找到服务器主机)
           参数四:服务器的端口号
        */
        byte[] bytes = "我是快乐的客户端,我爱编abc".getBytes();
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length,
                                                   InetAddress.getLocalHost(), 6666);

        // 3. 开始正式发送这个数据包给服务器出去
        socket.send(packet);

        System.out.println("客户端数据发送完毕~~");
        socket.close(); // 释放资源
    }
}

服务端

public class Server {
    public static void main(String[] args) throws Exception {
        // 1. 创建一个服务器端对象(创建一个接连接来的入口)
        DatagramSocket socket = new DatagramSocket(6666);

        // 2. 创建一个数据包对象,用于接收数据
        byte[] buffer = new byte[1024 * 64]; // 64KB
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        // 3. 开始正式使用数据包对象接收客户端发来的数据
        socket.receive(packet);

        // 4. 从字节数组中,把收到的数据提取出来打印出来
        // 获取本次数据提取了多少数据长度
        int len = packet.getLength();

        String rs = new String(buffer, 0, len);
        System.out.println(rs);
        System.out.println(packet.getAddress().getHostAddress() + " " + packet.getPort());// 获取客户端的IP地址和端口号
        socket.close();
    }
}

启动应该先启动服务端,服务端启动成功后会等待接收数据,再启动客户端。

多发多收

客户端

public class Client {
    public static void main(String[] args) throws Exception {
        // 1. 创建客户端对象(发报出去的人)
        DatagramSocket socket = new DatagramSocket();

        // 2. 创建数据包对象把要发送出去的数据打包(创建一个信差搬运子)
        /* public DatagramPacket(byte buf[], int length, InetAddress address, int port)
           参数一:封装要发送的数据。
           参数二:发送出去的数据大小(字节数组)。
           参数三:服务器的IP地址(找到服务器主机)
           参数四:服务器的端口号
        */
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请说:");
            String msg = sc.nextLine();
        
            // 一旦发现用户输入的exit命令,就退出循环
            if ("exit".equals(msg)) {
                System.out.println("欢迎下次光临!");
                socket.close(); // 释放资源
                break; // 跳出死循环
            }
        }

        DatagramPacket packet = new DatagramPacket(bytes, bytes.length,
                InetAddress.getLocalHost(), 6666);

        // 3. 开始正式发送这个数据包给服务器出去
        socket.send(packet);

        System.out.println("客户端数据发送完毕~~");
        socket.close(); // 释放资源
    }
}

服务端

public class Server {
    public static void main(String[] args) throws Exception {
        // 1. 创建一个服务器端对象(创建一个接连接来的入口)
        DatagramSocket socket = new DatagramSocket(6666);

        // 2. 创建一个数据包对象,用于接收数据
        byte[] buffer = new byte[1024 * 64]; // 64KB
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        // 3. 开始正式使用数据包对象接收客户端发来的数据
        while (true) {
            socket.receive(packet);

            // 4. 从字节数组中,把收到的数据提取出来打印出来
            // 获取本次数据提取了多少数据长度
            int len = packet.getLength();

            String rs = new String(buffer, 0, len);
            System.out.println(rs);
        }
    }
}

可以打开多个客户端,可以进行多对一收消息,前提把IDEA的多开打开,然后端口号设为默认。

标签:UDP,DatagramPacket,socket,通信,packet,new,public,客户端
From: https://blog.51cto.com/u_16382144/11952931

相关文章

  • Kubernetes各模块如何与API Server通信
    Kubernetes的架构是基于一系列的组件和模块,这些组件通过APIServer进行通信。APIServer是Kubernetes控制平面的核心,负责处理所有的RESTfulAPI请求,并与etcd(用于存储集群状态)进行交互。以下是Kubernetes各个主要模块如何与APIServer通信的详细说明:1.Kubelet功能......
  • Emitter 线程通信
    文章目录前言一、线程通信二、Emitter通信1.介绍2.使用方法3.使用场景总结前言线程是一个操作系统能够运算调度的最小单位,被包含在进程之中,也是进程中的实际运作单位。而在一个应用中也许会有很多个进程,但是所有的UIAbility、ServiceExtensionAbility和Data......
  • 通信工程学习:什么是FDM频分复用、TDM时分复用、WDM波分复用、CDM码分复用
    FDM频分复用、TDM时分复用、WDM波分复用、CDM码分复用FDM频分复用、TDM时分复用、WDM波分复用、CDM码分复用是通信领域中常见的四种复用技术,它们各自具有不同的特点和应用场景。以下是对这四种复用技术的详细解释:一、FDM频分复用(Frequency-divisionMultiplexing)1、FDM频分......
  • 通信工程学习:什么是ASK振幅键控、FSK频移键控、PSK相移键控
    ASK振幅键控、FSK频移键控、PSK相移键控    ASK(振幅键控)、FSK(频移键控)和PSK(相移键控)是三种常见的数字调制技术,它们各自通过不同的方式改变载波的某个参数来传输数字信息。以下是对这三种调制技术的详细解释:一、ASK振幅键控1、ASK振幅键控的定义:    ASK(Amp......
  • docker php和nginx的通信
    1安装网络dockernetworkcreatephpClassExamples_network2安装nginx2.1生成临时容器dockerrun-it--nametest_nginx-dnginx查看临时容器内部,找到关键目录1、工作目录:lsusr/share/nginx/html 2、配置目录lsetc/nginx/conf.d3、日志目录lsvar......
  • PLC(电力载波通信)网络机制介绍
    1.概述1.1什么是PLC电力载波通讯即PLC,是英文PowerlineCarrier的简称。电力载波是电力系统特有的通信方式,电力载波通讯是指利用现有电力线,通过载波方式将模拟或数字信号进行高速传输的技术。最大特点是不需要重新架设网络,只要有电线,就能进行数据传递。 名词解释:相位:C......
  • 电子电气架构---私有总线通信和诊断规则
    电子电气架构—私有总线通信和诊断规则我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师:屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益......
  • Mininet MAC地址学习:通过Mininet模拟二层交换机和两个主机,通过两个主机通信来了解交换
    一.MAC地址学习1.登录我们创建mininet的虚拟机,创建一个线型拓扑,控制器设置为无。2.查看全部节点,查看链路信息,然后查看节点信息3.再打开一个终端(Terminal窗口2),然后打开交换机s1和交换机s2的二层(因为交换机s1和交换机s2是两个SDN交换机,在启动Mininet时没有指定任何控制器,交......
  • 不同node上的Pod之间的通信过程
    在Kubernetes(K8s)中,不同节点上的Pod之间的通信是通过一套复杂的网络机制实现的。以下是不同节点上Pod之间通信的主要过程:1.网络模型K8s遵循“每个Pod都有一个唯一IP地址”的网络模型,确保集群内的Pod可以直接通过IP地址互相访问。这意味着无论Pod位于哪个节点,它们都可以通过其分......
  • 进程间通信-进程池
    目录理解​完整代码 完善代码 回收子进程:​ 不回收子进程:子进程使用重定向优化理解#include<iostream>#include<unistd.h>#include<string>#include<vector>#include<sys/types.h>voidwork(intrfd){}//masterclassChannel{private:i......