Springboot+Netty搭建基于UDP协议的客户端(四)

使用Netty+SpringBoot方式可以快速地开发一套基于UDP协议的服务端程序,同样的也可以开发客户端,一般使用UDP都是使用原生的方式,发送消息后就不管不问,也就是不需要确定消息是否收到,这里使用Netty创建的客户端和服务端倒是能够类似http协议那样请求数据,得到返回数据,实际上得到的就是服务端原路返回的数据。

1、这里也使用SpringBoot+Netty创建,pom.xml文件导入依赖包

​<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.6.RELEASE</version><relativePath /> <!-- lookup parent from repository --></parent><dependencies><!--web模块的启动器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- netty依赖 springboot2.x自动导入版本 --><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId></dependency></dependencies>

2、Netty客户端的类,包含main方法,这里就没有使用SpringBoot方式的启动

package boot.netty.udp.client;import java.net.InetSocketAddress;
import boot.netty.udp.client.adapter.BootNettyUdpClientSimpleChannelInboundHandler;
import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.DatagramPacket;
import io.netty.channel.socket.nio.NioDatagramChannel;
import io.netty.util.CharsetUtil;public class BootNettyUdpClient {public void bind(String address, int port, String data) {EventLoopGroup eventLoopGroup = new NioEventLoopGroup();try {Bootstrap clientBootstrap = new Bootstrap();clientBootstrap = clientBootstrap.group(eventLoopGroup);clientBootstrap = clientBootstrap.channel(NioDatagramChannel.class);clientBootstrap = clientBootstrap.option(ChannelOption.SO_BROADCAST, true);clientBootstrap = clientBootstrap.handler(new BootNettyUdpClientSimpleChannelInboundHandler());Channel channel = clientBootstrap.bind(0).sync().channel();channel.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer(data, CharsetUtil.UTF_8),new InetSocketAddress(address,port))).sync();//  与BootNettyUdpClientSimpleChannelInboundHandler中的ctx.channel().id().toString()是一样的值System.out.println("channnel id = "+channel.id().toString());//  方式一:查询等待超时 单位s  等待服务端原路返回的消息,//  在channelRead0(ChannelHandlerContext ctx, DatagramPacket msg)方法中//  收到消息后可主动关闭channel,此处等待自然释放  channel.closeFuture().await(10000);//	方式二:直接等待服务端原路返回后在channelRead0(ChannelHandlerContext ctx, DatagramPacket msg)方法中//  收到消息后可主动关闭channe//  若服务端没有原路返回消息或者消息未收到将会一直等待,浪费资源//channel.closeFuture().sync();} catch (Exception e) {// TODO: handle exception} finally {System.out.println("netty client udp close!");eventLoopGroup.shutdownGracefully();}}public static void main(String[] args) {//  向网段内的所有机器广播UDP消息,这个没试过是不是这个原理// new BootNettyUdpClient().bind("255.255.255.255",9999,"I am client");// 指定某个套接字地址和发送的内容可以发送消息// 该方式也可以封装成一个udp的客户端的send类new BootNettyUdpClient().bind("127.0.0.1",9999,"I am client");}}

3、服务端I/O数据读写处理类

package boot.netty.udp.client.adapter;import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.socket.DatagramPacket;
import io.netty.util.CharsetUtil;public class BootNettyUdpClientSimpleChannelInboundHandler extends SimpleChannelInboundHandler<DatagramPacket> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception {try {String strdata = msg.content().toString(CharsetUtil.UTF_8);//打印收到的消息System.out.println("msg---"+strdata);// 与BootNettyUdpClient中的channel.id().toString()是一样的值System.out.println(ctx.channel().id().toString());//	收到服务端原路返回的消息后,不需要再次向服务端发送消息, 可以在这里暴力关闭,也可以在 channelReadComplete(ChannelHandlerContext ctx)内//  ctx.close();} catch (Exception e) {}}/*** 	重写方法* 	结构:* 	1.public class BootNettyUdpClientSimpleChannelInboundHandler extends SimpleChannelInboundHandler<DatagramPacket>** 	2.public abstract class SimpleChannelInboundHandler<I> extends ChannelInboundHandlerAdapter** 	3.public class ChannelInboundHandlerAdapter extends ChannelHandlerAdapter implements ChannelInboundHandler** 	ChannelInboundHandlerAdapter类有诸多方法可以重写,可以根据具体需求来写**/@Overridepublic void channelReadComplete(ChannelHandlerContext ctx) throws Exception {super.channelReadComplete(ctx);System.out.println("关闭channel");ctx.close();}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {cause.printStackTrace();ctx.close();}}4、我们可以启动一个服务端(SpringBoot搭建基于UDP协议的服务端)然后调用main方法,可以看到服务端可以收到消息,客户端也可以收到服务端原路返回的时间戳消息public static void main(String[] args) {//  向网段内的所有机器广播UDP消息,这个没试过是不是这个原理// new BootNettyUdpClient().bind("255.255.255.255",9999,"I am client");// 指定某个套接字地址和发送的内容可以发送消息// 该方式也可以封装成一个udp的客户端的send类new BootNettyUdpClient().bind("127.0.0.1",9999,"I am client");}

4、我们可以启动一个服务端(SpringBoot搭建基于UDP协议的服务端)然后调用main方法,可以看到服务端可以收到消息,客户端也可以收到服务端原路返回的时间戳消息

public static void main(String[] args) {//  向网段内的所有机器广播UDP消息,这个没试过是不是这个原理// new BootNettyUdpClient().bind("255.255.255.255",9999,"I am client");// 指定某个套接字地址和发送的内容可以发送消息// 该方式也可以封装成一个udp的客户端的send类new BootNettyUdpClient().bind("127.0.0.1",9999,"I am client");}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows 不同方式打开的cmd/dos窗口属性配置不同

文章目录 1. 默认值&#xff08;控制台窗口&#xff09;属性2. "C:\Windows\System32\cmd.exe" 属性3. "命令提示符"属性4. 自定义某标题cmd窗口属性5. cmd快捷方式的属性总结 最近在写某个批处理脚本时&#xff0c;意外发现 Windows系统中&#xff0c;在不…

mac 中 brctl 怎么用

mac 中 brctl 怎么用 mac 中 brctl 怎么用1.使用 Homebrew 安装 bridge2.安装完成后&#xff0c;你可以使用 bridge 命令来管理网络桥接。 mac 中 brctl 怎么用 在 macOS 中&#xff0c;没有官方提供的 brctl 命令行工具。但是&#xff0c;你可以使用一个名为 bridge 的开源工…

HBuilder 编辑器终端窗口无法输入,未响应的解决方案

HBuilder 编辑器终端窗口无法输入&#xff0c;未响应的解决方案 一、找到 HBuilder 安装目录 找到 main.js HBuilderX - plugins - builtincef3terminal - script - main.js 二、编辑 main.js 将 main.js 文件中的 powershell.exe 和 cmd.exe 路径都改为绝对路径 C:/Windows…

传染病模型

title: 传染病模型 date: 2023-7-24 10:55:00 updated: 2023-7-24 10:55:00 tags: 算法数学建模传染病模型matlab categories: 数学建模 传染病模型中的符号表示 SI模型&#xff08;艾滋传染模型&#xff09; %% 直接求微分方程的解析解 dsolve(Dx1 -0.1 * x1 * x2 / 1000, D…

SSIS对SQL Server向Mysql数据转发表数据 (三)

1、在控制流界面&#xff0c;在左侧的组件里&#xff0c;添加一个“序列容器组件”和一个“数据流任务组件” 2、双击数据流任务&#xff0c;进入到数据流界面&#xff0c;然后再在左面添加一个OLE DB 源组件、目标源组件 3、右键源组件&#xff0c;编辑&#xff0c;选择好相关…

Aerotech系列文章(3)运动设置命令Motion Setup Commands

1.运动设置命令Motion Setup Commands 斜坡类型&#xff1a; 直线&#xff0c;S曲线&#xff0c;与正弦曲线 Enumerator: RAMPTYPE_Linear Linear-based ramp type. RAMPTYPE_Scurve S-curve-based ramp type. RAMPTYPE_Sine Sine-based ramp type. 函数原型&a…

2023年 React 最佳学习路线

CSS CSS JavaScript JavaScript TypeScript 目前没有找到比其他文档好很多的文档地址 可以先看官网 React 新版 React 官方文档无敌 React React-router-dom V5 V6 Webpack webpack Antd antd

神码ai火车头伪原创设置【php源码】

大家好&#xff0c;给大家分享一下python考什么内容&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 火车头采集ai伪原创插件截图&#xff1a; 1、Python 计算机二级都考什么 Python要到什么程度 考试内容 一、Python语言的基本语法元素…

Jenkins 拉取 GitHub 私有仓库失败问题

添加仓库的时候提示 stderr: fatal: Cannot prompt because user interactivity has been disabled. 把在 GitHub账户设置中生成的个人访问令牌填到地址里

如何使用Flask-WTF来处理表单提交和验证?

处理表单提交和验证是个麻烦的问题&#xff0c;但是我们可以使用Flask-WTF让它变得简单一些&#xff01;Flask-WTF是一个Flask插件&#xff0c;它结合了Flask和WTForms&#xff0c;使得在Flask应用中处理表单变得非常简单。 首先&#xff0c;我们要安装Flask-WTF。你可以使用p…

技术分享 | App测试时常用的adb命令你都掌握了哪些呢?

adb 全称为 Android Debug Bridge&#xff08;Android 调试桥&#xff09;&#xff0c;是 Android SDK 中提供的用于管理 Android 模拟器或真机的工具。 adb 是一种功能强大的命令行工具&#xff0c;可让 PC 端与 Android 设备进行通信。adb 命令可执行各种设备操作&#xff0…

UE5引擎源码小记 —反射信息注册过程

序 最近看了看反射相关的知识&#xff0c;用不说一点人话的方式来说&#xff0c;反射是程序在运行中能够动态获取修改或调用自身属性的东西。 一开始我是觉得反射用处好像不大&#xff0c;后续查了下一些反射的使用环境&#xff0c;发现我格局小了&#xff0c;我觉得用处不大的…

43.240.75.X服务器是什么,有什么作用?

什么是服务器&#xff1f;今天我们来了解下服务器到底是什么&#xff1f;还有服务器用途是什么&#xff1f;让我们对服务器有一个简单的了解。 43.240.75.1什么是服务器&#xff1f; 服务器是一台专门用于存储、处理和传输数据的计算机设备。它在网络中扮演着重要角色&#x…

cnvd水证书

日常水个证书 本人比较菜&#xff0c;挖cnvd总是挖不倒漏洞&#xff0c;只能从弱口令入手了&#xff0c;一般使用fofa脚本批量跑。 过程&#xff1a; 日常在佛法中我们总是会遇见设备弱口或系统弱口令 一般是看登录成功的特征和口令&#xff0c;写一个对应的弱口令检测脚本…

Linux虚拟机(lvm)报Unmount and run xfs_repair

问题 linux系统没有正常关机&#xff0c;今天启动虚拟机无法进入系统&#xff0c;提示metadata corruption deleted at xxxx&#xff1b; Unmount and run xfs_repair 分析 主机异常掉电后里面的虚拟机无法启动&#xff0c;主要是损坏的分区 解决 看出来应该是dm-0分区损坏…

unity表情显示在android或者ios原生页面上

国际通用表情库&#xff0c;附带表情unicode码 在unity里面将unicode码转换成字符串&#xff0c;然后就可以再android和ios原生上显示了&#xff0c; 如下是在unity里面将unicode码转字符串方法&#xff1a; string unicodeString char.ConvertFromUtf32((int)emojiSprite.un…

kubernetes中常见的exited code总结

什么是容器退出码 当容器终止时&#xff0c;容器引擎使用退出码来报告容器终止的原因。如果是 Kubernetes 用户&#xff0c;容器故障是 pod 异常最常见的原因之一&#xff0c;了解常见的容器退出码可以帮助在排查时更快捷找到 pod异常的根本原因。可以参考https://komodor.com…

WebClient,HTTP Interface远程调用阿里云API

HTTP Interface Spring 允许我们通过定义接口的方式&#xff0c;给任意位置发送 http 请求&#xff0c;实现远程调用&#xff0c;可以用来简化 HTTP 远程访问。需要webflux场景才可 <dependency><groupId>org.springframework.boot</groupId><artifactId&…

Spring中最简单的过滤器和监听器

1. 过滤器概念引入 Filter也称之为过滤器&#xff0c;它是Servlet技术中最实用的技术&#xff0c;Web开发人员通过Filter技术&#xff0c;对web服务器管理的所有web资源&#xff1a;例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截&#xff0c;从而实现一些特殊的功…

uniapp 微信小程序:页面+组件的生命周期顺序

uniapp 微信小程序&#xff1a;页面组件的生命周期顺序 首页页面父组件子组件完整顺序参考资料 这个uniapp的微信小程序项目使用的是 VUE2 首页 首页只提供了一个跳转按钮。 <template><view><navigator url"/pages/myPage/myPage?namejerry" hov…