[进阶]网络通信:UDP通信,一发一收、多发多收

UDP通信

  • 特点:无连接、不可靠通信
  • 不事先建立连接;发送端每次把要发送的数据(限制在64KB内)、接收端1P、等信息封装成一个数据包,发出去就不管了。
  • Java提供了一个java.net.Datagramsocket类来实现UDP通信。

DatagramSocket:用于创建客户端、服务端

 DatagramPacket:创建数据包

一发一收

客户端实现步骤:

  1. 创建DatagramSocket对象(客户端对象)
  2. 创建DatagramPacket对象封装需要发送的数据(数据包对象)
  3. 使用Datagramsocket对象的send方法,传入DatagramPacket对象
  4. 释放资源

服务端实现步骤:

  1. 创建Datagramsocket对象并指定端口(服务端对象)
  2. 创建DatagramPacket对象接收数据(数据包对象)
  3. 使用Datagramsocket对象的receive方法,传入DatagramPacket对象
  4. 释放资源

代码演示如下:

客户端

/**
 * 目标:完成UDP通信快速入门:实现一发一收
 */
public class Client {
    public static void main(String[] args) throws Exception{
        System.out.println("客户端启动啦!");
        //1.创建客户端对象(发韭菜出去的人)
        DatagramSocket socket = new DatagramSocket();
        //2.创建数据包对象封装要发出去的数据(创建一个韭菜盘子)
        /*public DatagramPacket(byte buf[], int length,
             InetAddress address, int port)
             参数一:封装要发出去的数据。
             参数二:发送出去的数据大小(字节个数)
             参数三:服务端的IP地址(找到服务端主机)
             参数四:服务端程序的端口。
        */
        byte[] bytes = "我爱学Java,我喜欢制造bug!".getBytes();
        DatagramPacket packet = new DatagramPacket(bytes,bytes.length,InetAddress.getLocalHost(),6666);
        //3.开始正式发送这个数据包的数据出去了
        socket.send(packet);

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

 服务端:

/**
 * 目标:完成UDP通信快速入门-服务端开发
 */
public class Server {
    public static void main(String[] args) throws Exception{
        System.out.println("服务端启动啦!");
        //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());
        System.out.println(packet.getPort());

        socket.close();//别忘记释放资源!
    }
}

反复发送

客户端实现步骤:

  1. 创建DatagramSocket对象(发送端对象)
  2. 使用while死循环不断的接收用户的数据输入,如果用户输入的exit则退出程序
  3. 如果用户输入的不是exit,把数据封装成DatagramPacket
  4. 使用DatagramSocket对象的send方法将数据包对象进行发送
  5. 释放资源

接收端实现步骤:

  1. 创建DatagramSocket对象并指定端口(接收端对象)
  2. 创建DatagramPacket对象接收数据(数据包对象)
  3. 使用DatagramSocket对象的receive方法传入DatagramPacket对象
  4. 使用while死循环不断的进行第3步

代码实习如下:

客户端:

public class Client {
    public static void main(String[] args) throws Exception{
        System.out.println("客户端启动啦!");
        //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;
            }
            byte[] bytes = msg.getBytes();
            DatagramPacket packet = new DatagramPacket(bytes,bytes.length,InetAddress.getLocalHost(),6666);
            //3.开始正式发送这个数据包的数据出去了
            socket.send(packet);
        }
    }
}

服务端:

public class Server {
    public static void main(String[] args) throws Exception{
        System.out.println("服务端启动啦!");
        //1.创建一个服务端对象(创建一个接韭菜的人)注册端口
        DatagramSocket socket = new DatagramSocket(6666);
        //2.创建一个数据包对象,用于接收数据的(创建一个韭菜盘子)
        byte[] buffer = new byte[1024 * 64]; // 64KB
        DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
        while (true) {
            //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());
            System.out.println(packet.getPort());
            System.out.println("--------------------------------");
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/30888.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Springboot项目使用原生Websocket

目录 1.启用Websocket功能2.封装操作websocket session的工具3.保存websocket session的接口4.保存websocket session的类5.定义websocket 端点6.创建定时任务 ping websocket 客户端 1.启用Websocket功能 package com.xxx.robot.config;import org.springframework.context.a…

NSSCTF MOBILE [SWPU 2019]easyapp 详细题解

文章目录 一. 前言二. 安装安卓SDK三. 安装安卓模拟器(推荐夜神模拟器)四. 安装frida和objection五. 解题过程六. 总结 一. 前言 题目地址:[SWPU 2019]easyapp大佬题解[SWPU 2019]easyapp pwjcw的WriteUp 大佬的题解很简单,直接hook就可以看到返回值,但是我看了半天没看明白是…

Redis简介

Redis是基于内存,也可以基于磁盘持久化nosql数据库,使用c语言开发。 数据存储结构:key-value 安装环境准备 Redis使用c语言开发,需要使用gcc编译程序进行编译。 1) 安装gcc a) 从磁盘镜像中进行安装:&…

决策树分类算法

#CSDN AI写作助手创作测评 目录 ID3算法 1.算法原理 2.代码实现 3.ID3算法的优缺点分析 C4.5算法 1.原理 2.优缺点 心得感受 决策树表示方法是应用最广泛的逻辑方法之一,它从一组无次序、无规则的事例中推理出决策树表示形式的分类规则。在决策树的内部…

Java集合详解

集合详解 1、集合,也可以说是容器。由两大接口派生而来,一个是collection,主要用于存储单一元素;另一个是map接口,主要用于存储键值对。 Collection接口 Map接口 2、集合和数组 在之前我们保存多个数据可以使用数组…

Tcl常用命令备忘录-正则命令篇

正则表达式是一种用于匹配、查找、替换文本中特定模式的工具。在Tcl脚本中,可以使用正则表达式对字符串进行匹配、查找和替换。 regexp 语法: regexp ?选项? 正则表达式 字符串 ?变量1 变量2 ...? 其中,?选项?为可选项,…

Spring Security OAuth2授权原理、流程与源码解读

文章目录 前言AuthorizationServerConfigurerAdapter(身份认证服务配置适配器)OAuth2AuthorizationServerConfiguration(OAuth2授权服务配置) EnableAuthorizationServer(开启身份认证服务)AuthorizationServerEndpointsConfigurations身份认证服务站点配置类AuthorizationEndp…

Qt编写精美输入法(历时十年迭代/可换肤/支持Qt4/5/6/win/linux/mac/嵌入式等)

一、前言 大概是从2012年就开始研究用Qt写输入法,因为项目需要,嵌入式板子上,没有对应的输入法,当初使用过很多NVR,里面也是鼠标按下弹出输入法面板进行输入,可以切换数字和字母及中文,于是借鉴…

jmeter如何进行http压力测试

目录 前言: 1、添加线程组: 2、添加采样器: 3、添加监视器 压力测试知识说明 前言: JMeter是一个基于Java的开源压力测试工具,可用于评估Web应用程序的性能,包括HTTP、HTTPS、FTP、SOAP、Restful、JD…

Oracle-高版本SQL优化分析(bind mismatch)

背景: 接到用户报障说一套Oracle19c数据库近期出现insert语句执行变慢的情况,执行一次数据插入需要1秒的时间,而且问题发生的数据库是跑在一体机上面,数据插入正常不应该这么慢,需要分析插入慢的原因 问题: 数据库近期出现insert…

StarRocks 文章收集

StarRocks在58的实践 StarRocks在58的实践 - 墨天轮StarRocks在58的实践 --2022-06-08https://www.modb.pro/db/639611 StarRocks之系统架构 StarRocks之系统架构 - 墨天轮https://www.modb.pro/db/610300 StarRocks小规模集群部署最佳实践(1/2) 0016.S StarRocks小规模集…

2自由度并联仿生腿的制作

1. 运动功能说明 本文实例将实现2自由度并联仿生腿模组运动起来,模拟实现狗腿行走的动作。 2. 结构说明 2自由度并联仿生腿模组是由两个舵机驱动的,它的所有动作都将在两个舵机的配合运动下实现。 3. 运动原理说明 2自由度并联仿生腿模组运动的点位如下…

数据结构-各种树(二叉树、二叉查找树、平衡二叉树、红黑树、B树、B+树)

文章目录 二叉树二叉查找树平衡二叉树红黑树B树B树 二叉树 概念:二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一…

2023 年6月开发者调查统计结果——最流行的技术(1)

2023 年6月开发者调查统计结果——最流行的技术(1) 本文目录: 一、编程、脚本和标记语言 二、数据库 三、云平台 四、网络框架和技术 五、其他框架和库 六、其他工具 七、集成开发环境 八、异步工具 九、同步工具 ​十、操作系统 …

端午出行电脑没网怎么办?无线网卡解决网络问题

无线网卡是一种可以让电脑或其他设备通过无线信号连接网络的硬件设备,无线网卡有多种类型和接口,例如USB无线网卡,PCI-E无线网卡,PCMCIA无线网卡等。端午出行在即,不妨看看驱动人生准备的无线网卡攻略,让大…

基于Python的招聘信息可视化系统,附源码

文章目录 1 简介2 技术栈3 总体设计3.1 系统结构3.2 数据库设计3.2.1 数据库实体3.2.2 数据库表设计 4 运行设计4.1 招聘热门行业分析4.2热门岗位分析界面4.3招聘岗位学历分析界面4.4岗位分布分析界面 5 源码下载 1 简介 基于Python的招聘信息可视化系统,通过对招聘数据进行分…

MFC扩展库BCGControlBar Pro v33.5亮点 - Ribbon Bar等全新升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中,并为您节省数百个开发和调试时间。 BCGControlBar专业版 v33.5已正式发布了,此版本包含了Ribbon(功能区)自定义…

Linux国产操作系统,UCA-系统工程师学习必备技能,使用dpkg管理软件包、apt命令、内网获取依赖包及源码安装

目录 ​编辑 1.使用dpkg管理软件包 2.apt命令 3.内网获取依赖包 4.源码安装 1.使用dpkg管理软件包 第一种方法当然可以上网搜索软件安装包,下载然后解压成软件。 第二种也就是我接下来要介绍的,dpkg 命令,dpkg 全称叫做debian package…

步长(stride) | 填充(padding) | 扩长(dilation)

这几个名词中文真的好难翻译,不是大佬就不要造名词了,后面还是老老实实用英文吧!(标题是机翻的 。) stride stride 很好理解,stride 就是卷积核移动的步长。 如下图: stride1 stride2 paddi…

技术新动向 | 谷歌云大举扩展安全 AI 生态系统

【本文由 Cloud Ace 整理发布, Cloud Ace 是谷歌云全球战略合作伙伴,拥有 300 多名工程师,也是谷歌最高级别合作伙伴,多次获得 Google Cloud 合作伙伴奖。作为谷歌托管服务商,我们提供谷歌云、谷歌地图、谷歌办公套件…
最新文章