本篇主要介绍Netty基于UDP协议的开发
一,UDP协议介绍
UDP:无连接的,通信双方不需要建立物理链路连接。在网络中它用于处理数据包,在OSI模型中,它处于第四层传输层,即位于IP协议的上一层。它不对数据报分组,组装,校验和排序,因此是不可靠的。
UDP协议的特点:
1,UDP传送数据前并不与对方建立连接,即UDP是无连接的。在传输数据前,发送方和接收方相互交换信息使双方同步。
2,UDP对接收到的数据报不发送确认信号,发送端不知道数据是否被正确接收,也不会重发数据。
3,UDP传送数据比TCP快速,系统开销也少。
应用场景:
1,由于UDP比TCP简单,灵活,常用于可靠性要求不高的数据传输,如视频,图片以及简单文件传输系统。
2,TCP则适用于可靠性要求很高但实时性要求不高的应用。如文件传输协议FTP,超文本传输协议HTTP,简单邮件传输协议SMTP等。
二,Netty基于UDP协议的开发实例
package com.huawei.netty.udp; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioDatagramChannel; /** * Created by liuzhengqiu on 2017/11/17. */ public class ChineseProverbServer { public void run(int port) throws Exception { EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap bootstrap = new Bootstrap(); bootstrap.group(group).channel(NioDatagramChannel.class) .option(ChannelOption.SO_BROADCAST,true) .handler(new ChineseProverbServerHandler()); bootstrap.bind(port).sync().channel().closeFuture().await(); } finally { group.shutdownGracefully(); } } public static void main(String[] args) throws Exception { new ChineseProverbServer().run(8080); } }
package com.huawei.netty.udp; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.socket.DatagramPacket; import io.netty.util.CharsetUtil; import java.util.concurrent.ThreadLocalRandom; /** * Created by liuzhengqiu on 2017/11/17. */ public class ChineseProverbServerHandler extends SimpleChannelInboundHandler<DatagramPacket> { private static final String[] STRINGS = {"本是后山人,偶作前堂客。", "醉舞经阁半卷书,坐#说天阔。", "大志戏功名,海斗量福祸。", "论到囊中羞涩时,怒指乾坤错。"}; private String nextQuote() { int quoteId = ThreadLocalRandom.current().nextInt(STRINGS.length); return STRINGS[quoteId]; } @Override protected void channelRead0(ChannelHandlerContext channelHandlerContext, DatagramPacket datagramPacket) throws Exception { String req = datagramPacket.content().toString(CharsetUtil.UTF_8); System.out.println(req); if ("成语查询?".equals(req)) { channelHandlerContext.writeAndFlush( new DatagramPacket( Unpooled.copiedBuffer("成语查询结果:"+nextQuote(),CharsetUtil.UTF_8), datagramPacket.sender())); } } @Override public void exceptionCaught(ChannelHandlerContext ctx,Throwable cause) throws Exception { ctx.close(); cause.printStackTrace(); } }
package com.huawei.netty.udp; 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; import java.net.InetSocketAddress; /** * Created by liuzhengqiu on 2017/11/17. */ public class ChineseProverbClient { public void run(int port) throws Exception{ EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap bootstrap = new Bootstrap(); bootstrap.group(group).channel(NioDatagramChannel.class) .option(ChannelOption.SO_BROADCAST,true) .handler(new ChineseProverbClientHandler()); Channel ch = bootstrap.bind(0).sync().channel(); ch.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer("成语查询?", CharsetUtil.UTF_8), new InetSocketAddress("255.255.255.255",port))).sync(); if (!ch.closeFuture().await(15000)) { System.out.println("查询超时!"); } } finally { group.shutdownGracefully(); } } public static void main(String[] args) throws Exception { new ChineseProverbClient().run(8080); } }
package com.huawei.netty.udp; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.socket.DatagramPacket; import io.netty.util.CharsetUtil; /** * Created by liuzhengqiu on 2017/11/17. */ public class ChineseProverbClientHandler extends SimpleChannelInboundHandler<DatagramPacket> { @Override protected void channelRead0(ChannelHandlerContext channelHandlerContext, DatagramPacket datagramPacket) throws Exception { String response = datagramPacket.content().toString(CharsetUtil.UTF_8); if (response.startsWith("成语查询结果:")) { System.out.println(response); channelHandlerContext.close(); } } @Override public void exceptionCaught(ChannelHandlerContext ctx,Throwable cause) throws Exception { cause.printStackTrace(); ctx.close(); } }
三,总结
介绍了如何利用Netty进行UDP服务端和客户端的开发。对UDP协议进行了简单的介绍,如果读者所从事的工作跟UDP强相关,可以通过其他UDP相关书籍进行深入学习。
相关推荐
在本篇关于“Netty框架学习——第一个Netty应用”的文章中,我们将深入理解如何使用Netty构建一个简单的Echo服务器和客户端。Netty是一个高性能、异步事件驱动的网络应用程序框架,广泛应用于Java领域的服务器开发。...
本篇文章将深入探讨 Netty 的核心概念、特性以及其在实际开发中的应用。 Netty 框架由 Java 编写,它提供了一套丰富的预构建的组件,如协议解码器、编码器、处理程序和管道,这些组件可以帮助开发者快速、高效地...
### Netty案例集锦(并发编程篇) #### Netty的特点 Netty因其高效且易于使用的特性而被广泛采用。其特点主要包括: 1. **简洁的API封装**:Netty简化了复杂的网络通信过程,通过诸如`Bootstrap`这样的工具类进行...
- **1.9 应用程序关闭**:了解如何优雅地关闭Netty应用程序。 - **1.10 总结**:回顾本章所学的主要内容。 **2. 架构概述** - **2.1 丰富的缓冲数据结构**:Netty提供了高效的缓冲机制,能够更好地管理数据。 - **...
《深入浅出Netty》是一本专注于介绍Netty框架的专著,旨在帮助读者全面理解并...通过深入阅读《深入浅出Netty》这本书,读者可以逐步掌握这些核心概念,并将Netty应用到实际的项目开发中,提升网络通信的效率和可靠性。
提供的两个Netty精品教材,可能是详尽的教程或者深入的技术指南,涵盖了Netty的基础到高级主题。教材可能包括以下内容: - **基础篇**:介绍Netty的基本架构,如ByteBuf(缓冲区)、ChannelFuture和Promise(异步...
5. **构建第一个Netty应用** 6. **Netty从底层构建** 7. **传输层** 8. **缓冲区** 9. **通道处理器(Channel Handler)** 10. **编解码(Codec)** 11. **提供的通道处理器和编解码器** 12. **启动Netty应用程序** 13. ...
本篇文章将深入探讨如何利用JBoss Netty创建高效的Web Service客户端和服务端。 首先,我们需要理解Netty的基本工作原理。Netty采用非阻塞I/O模型,基于Java NIO(非阻塞输入/输出)库,允许在网络操作中进行高并发...
本篇文章将深入探讨Netty的关键知识点,帮助读者理解和掌握这一强大的网络编程工具。 1. **Netty概述** - Netty的起源与背景:Netty由JBoss创始人Markus Stenberg发起,旨在提供一个高效、灵活且易于使用的网络...
本篇将深入探讨如何利用Netty实现CometStreaming方式的聊天室。 首先,我们要理解CometStreaming是什么。Comet是一种Web技术,它允许服务器向浏览器推送数据,而不是传统的HTTP请求-响应模式。在聊天室场景中,这种...
在本篇“Netty开发记录三”中,我们将深入探讨Netty框架的使用,这是一个高效、灵活且可扩展的网络应用程序框架,广泛应用于高性能服务器和客户端的开发。Netty简化了网络编程,提供了异步事件驱动的网络通信模型,...
Netty 基础篇:java的IO演进之路; BIO ;NIO;伪异步;NIO类库 ; 入门篇:Jetty简单应用入门;...高级篇:Http协议开发; Netty 协议栈开发(数据结构定义,消息编解码,握手安全认证,心跳检测等); WebSocket等
这篇博客“Java学习之IO总结及mina和netty”探讨了Java IO的基础知识,并深入到两个高级网络通信框架——Mina和Netty。Mina和Netty都是基于NIO(非阻塞IO)的高性能网络应用框架,它们简化了复杂网络编程的实现。 *...
### Netty文档知识点详解 #### 一、Netty概述与问题背景 - **Netty**是一种高性能、异步事件驱动的网络应用框架及工具包...无论是对于初学者还是高级开发者而言,Netty都是构建高效、可扩展网络应用程序的理想选择。
本篇文章将深入探讨NIO的基本原理和Netty框架的使用,帮助你从初学者逐渐晋升为高级开发者。 首先,我们来了解**NIO**。NIO是一种与传统的IO模型不同的I/O方式,传统IO基于缓冲区的读写,而NIO则是基于通道...
总结来说,从NIO到Netty,我们看到的是从底层I/O模型到高级通信框架的发展,Netty通过封装复杂的网络编程细节,提供了高效、易用的解决方案,极大地简化了开发者的任务,提升了应用的性能和稳定性。