哪个网站可以做海报,管理咨询有限公司经营范围,信号增强器设置网站,如何建立公司网站建设小傅哥 | https://bugstack.cn 沉淀、分享、成长#xff0c;让自己和他人都能有所收获。专注于原创专题案例编写#xff0c;目前已完成的专题有#xff1b;Netty4.x实战专题案例、用Java实现JVM、基于JavaAgent的全链路监控、手写RPC框架、架构设计专题案例、源码分析等。你…小傅哥 | https://bugstack.cn 沉淀、分享、成长让自己和他人都能有所收获。专注于原创专题案例编写目前已完成的专题有Netty4.x实战专题案例、用Java实现JVM、基于JavaAgent的全链路监控、手写RPC框架、架构设计专题案例、源码分析等。你用剑 、我用刀 好的代码都很烧望你不吝出招一、前言介绍 在Netty通信中UDP的实现方式也非常简单只要注意部分代码区别于TCP即可。本章节需要注意的知识点 NioDatagramChannel、ChannelOption.SO_BROADCASTInternet 协议集支持一个无连接的传输协议该协议称为用户数据报协议UDPUser Datagram Protocol。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法。RFC 768 1 描述了 UDP。Internet 的传输层有两个主要协议互为补充。无连接的是 UDP它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外几乎没有做什么特别的的事情。面向连接的是 TCP该协议几乎做了所有的事情。二、环境准备 1、jdk1.8【jdk1.7以下只能部分支持netty】2、Netty4.1.36.Final【netty3.x 4.x 5每次的变化较大接口类名也随着变化】3、NetAssist 网络调试助手可以从网上下载也可以联系我微信公众号bugstack虫洞栈 | 关注回复你的邮箱三、代码示例 itstack-demo-netty-1-11
└── src├── main│ └── java│ └── org.itstack.demo.netty│ ├── client│ │ ├── MyChannelInitializer.java│ │ ├── MyClientHandler.java│ │ └── NettyClient.java│ └── server│ ├── MyChannelInitializer.java│ ├── MyServerHandler.java│ └── NettyServer.java└── test└── java└── org.itstack.demo.netty.test└── ApiTest.javaclient/MyChannelInitializer.java/*** 虫洞栈https://bugstack.cn* 公众号bugstack虫洞栈 获取学习源码* 虫洞群①群5398358 ②群5360692* Create by fuzhengwei on 2019*/
public class MyChannelInitializer extends ChannelInitializerNioDatagramChannel {Overrideprotected void initChannel(NioDatagramChannel ch) throws Exception {ChannelPipeline pipeline ch.pipeline();// 解码转String注意调整自己的编码格式GBK、UTF-8//pipeline.addLast(stringDecoder, new StringDecoder(Charset.forName(GBK)));pipeline.addLast(new MyClientHandler());}}client/MyClientHandler.java/*** 虫洞栈https://bugstack.cn* 公众号bugstack虫洞栈 获取学习源码* 虫洞群①群5398358 ②群5360692* Create by fuzhengwei on 2019*/
public class MyClientHandler extends SimpleChannelInboundHandlerDatagramPacket {//接受服务端发送的内容Overrideprotected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception {String msg packet.content().toString(Charset.forName(GBK));System.out.println(new SimpleDateFormat(yyyy-MM-dd HH:mm:ss).format(new Date()) UDP客户端接收到消息 msg);}}client/NettyClient.java/*** 虫洞栈https://bugstack.cn* 公众号bugstack虫洞栈 获取学习源码* 虫洞群①群5398358 ②群5360692* Create by fuzhengwei on 2019*/
public class NettyClient {public static void main(String[] args) {EventLoopGroup group new NioEventLoopGroup();try {Bootstrap b new Bootstrap();b.group(group).channel(NioDatagramChannel.class).handler(new MyChannelInitializer());Channel ch b.bind(7398).sync().channel();//向目标端口发送信息ch.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer(你好端口7397的bugstack虫洞栈我是客户端小爱你在吗, Charset.forName(GBK)),new InetSocketAddress(127.0.0.1, 7397))).sync();ch.closeFuture().await();} catch (Exception e) {e.printStackTrace();} finally {group.shutdownGracefully();}}}server/MyChannelInitializer.java/*** 虫洞栈https://bugstack.cn* 公众号bugstack虫洞栈 获取学习源码* 虫洞群①群5398358 ②群5360692* Create by fuzhengwei on 2019*/
public class MyChannelInitializer extends ChannelInitializerNioDatagramChannel {private EventLoopGroup group new NioEventLoopGroup();Overrideprotected void initChannel(NioDatagramChannel ch) throws Exception {ChannelPipeline pipeline ch.pipeline();// 解码转String注意调整自己的编码格式GBK、UTF-8//pipeline.addLast(stringDecoder, new StringDecoder(Charset.forName(GBK)));pipeline.addLast(group, new MyServerHandler());}}server/MyServerHandler.java/*** 虫洞栈https://bugstack.cn* 公众号bugstack虫洞栈 获取学习源码* 虫洞群①群5398358 ②群5360692* Create by fuzhengwei on 2019*/
public class MyServerHandler extends SimpleChannelInboundHandlerDatagramPacket {Overrideprotected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception {String msg packet.content().toString(Charset.forName(GBK));System.out.println(new SimpleDateFormat(yyyy-MM-dd HH:mm:ss).format(new Date()) UDP服务端接收到消息 msg);//向客户端发送消息String json 微信公众号bugstack虫洞栈通知我已经收到你的消息rn;// 由于数据报的数据是以字符数组传的形式存储的所以传转数据byte[] bytes json.getBytes(Charset.forName(GBK));DatagramPacket data new DatagramPacket(Unpooled.copiedBuffer(bytes), packet.sender());ctx.writeAndFlush(data);//向客户端发送消息}}server/NettyServer.java/*** 虫洞栈https://bugstack.cn* 公众号bugstack虫洞栈 获取学习源码* 虫洞群①群5398358 ②群5360692* Create by fuzhengwei on 2019*/
public class NettyServer {public static void main(String[] args) throws InterruptedException {EventLoopGroup group new NioEventLoopGroup();try {Bootstrap b new Bootstrap();b.group(group).channel(NioDatagramChannel.class).option(ChannelOption.SO_BROADCAST, true) //广播.option(ChannelOption.SO_RCVBUF, 2048 * 1024)// 设置UDP读缓冲区为2M.option(ChannelOption.SO_SNDBUF, 1024 * 1024)// 设置UDP写缓冲区为1M.handler(new MyChannelInitializer());ChannelFuture f b.bind(7397).sync();System.out.println(itstack-demo-netty udp server start done. {关注公众号bugstack虫洞栈获取源码});f.channel().closeFuture().sync();} finally {//优雅的关闭释放内存group.shutdownGracefully();}}}四、测试结果 启动NettyServeritstack-demo-netty udp server start done. {关注公众号bugstack虫洞栈获取源码}
2019-09-01 16:58:34 UDP服务端接收到消息你好端口7397的bugstack虫洞栈我是客户端小爱你在吗
2019-09-01 16:59:15 UDP服务端接收到消息你好有人在关注bugstack公众号关注可以获得源码
2019-09-01 16:59:15 UDP服务端接收到消息你好有人在关注bugstack公众号关注可以获得源码
2019-09-01 16:59:16 UDP服务端接收到消息你好有人在关注bugstack公众号关注可以获得源码
2019-09-01 16:59:17 UDP服务端接收到消息你好有人在关注bugstack公众号关注可以获得源码
2019-09-01 16:59:17 UDP服务端接收到消息你好有人在关注bugstack公众号关注可以获得源码
2019-09-01 16:59:18 UDP服务端接收到消息你好有人在关注bugstack公众号关注可以获得源码
2019-09-01 16:59:18 UDP服务端接收到消息你好有人在关注bugstack公众号关注可以获得源码
2019-09-01 16:59:19 UDP服务端接收到消息你好有人在关注bugstack公众号关注可以获得源码
2019-09-01 16:59:19 UDP服务端接收到消息你好有人在关注bugstack公众号关注可以获得源码Process finished with exit code -1启动NettyClient2019-09-01 16:58:34 UDP客户端接收到消息微信公众号bugstack虫洞栈通知我已经收到你的消息Process finished with exit code -1在启动一个网络调试助手NetAssist | 这样方便我们验证