本篇主要介绍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领域的服务器开发。...
基础篇 走进Java NIO 入门篇 Netty NIO开发指南 中级篇 Netty编解码开发指南 高级篇 Netty多协议开发和应用 源码分析篇 Netty功能介绍和源码分析 架构和行业应用篇 Netty高级特性
《深入浅出Netty》是一本专注于介绍Netty框架的专著,旨在帮助读者全面理解并...通过深入阅读《深入浅出Netty》这本书,读者可以逐步掌握这些核心概念,并将Netty应用到实际的项目开发中,提升网络通信的效率和可靠性。
提供的两个Netty精品教材,可能是详尽的教程或者深入的技术指南,涵盖了Netty的基础到高级主题。教材可能包括以下内容: - **基础篇**:介绍Netty的基本架构,如ByteBuf(缓冲区)、ChannelFuture和Promise(异步...
本篇文章将深入探讨如何利用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)的高性能网络应用框架,它们简化了复杂网络编程的实现。 *...
本篇文章将深入探讨NIO的基本原理和Netty框架的使用,帮助你从初学者逐渐晋升为高级开发者。 首先,我们来了解**NIO**。NIO是一种与传统的IO模型不同的I/O方式,传统IO基于缓冲区的读写,而NIO则是基于通道...
本篇将深入探讨如何利用Java Netty框架来实现类似微信的功能,以及相关的技术细节。 1. **Netty基础** - **非阻塞I/O**:Netty基于NIO(Non-blocking I/O)模型,提高了处理大量连接的能力,特别适合于高并发的...
虽然描述部分为空,但根据提供的博客链接(https://xgw123485.iteye.com/blog/1178464),我们可以推测这可能是一个在线分享的资源,博主xgw123485在ITEYE平台上发布了一篇关于Java高级编程的文章或者教程。...
同时,NIO(非阻塞I/O)和异步I/O(AIO)为高性能网络应用提供了可能,如Netty框架就是基于这些概念构建的。 异常处理是Java程序健壮性的保障。通过try-catch-finally语句块,我们可以捕获并处理运行时出现的异常,...
- Netty框架:高性能的异步事件驱动网络应用框架,可能用于构建高效的网络应用服务器。 6. **性能优化与调试** - 网络延迟优化:源码可能包含如何减少网络延迟,提高网络通信效率的策略。 - 错误处理与日志记录...
本篇文章将详细讲解"jboss-3.2.5.zip"这一版本的JBoss安装、配置及EJBCA的安装和设置过程。 一、JBoss 3.2.5简介 JBoss 3.2.5是在2004年发布的一个版本,它是Java社区的重要里程碑,为开发者提供了轻量级、开源的...
7. **Java网络框架**:Spring Boot、Netty、Grizzly等框架简化了网络应用的开发,提供了高级功能如异步处理、性能优化和自定义协议支持。 8. **分布式服务**:Java在分布式计算中的应用,如RMI(Remote Method ...
这篇博客将深入探讨Java Socket编程的核心概念、用法以及相关工具。 首先,我们来了解Socket的基本概念。Socket可以被看作是网络上的端点,它允许两个应用程序通过Internet进行通信。一个Socket由IP地址和端口号...