`
liuzhengqiu0127
  • 浏览: 7237 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Netty应用高级篇三

阅读更多

本篇主要介绍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 应用(csdn)————程序.pdf

    在本篇关于“Netty框架学习——第一个Netty应用”的文章中,我们将深入理解如何使用Netty构建一个简单的Echo服务器和客户端。Netty是一个高性能、异步事件驱动的网络应用程序框架,广泛应用于Java领域的服务器开发。...

    Netty权威指南 PDF电子书下载 带目录书签 完整版

    基础篇 走进Java NIO 入门篇 Netty NIO开发指南 中级篇 Netty编解码开发指南 高级篇 Netty多协议开发和应用 源码分析篇 Netty功能介绍和源码分析 架构和行业应用篇 Netty高级特性

    深入浅出Netty

    《深入浅出Netty》是一本专注于介绍Netty框架的专著,旨在帮助读者全面理解并...通过深入阅读《深入浅出Netty》这本书,读者可以逐步掌握这些核心概念,并将Netty应用到实际的项目开发中,提升网络通信的效率和可靠性。

    Netty最容易懂的实例和教材

    提供的两个Netty精品教材,可能是详尽的教程或者深入的技术指南,涵盖了Netty的基础到高级主题。教材可能包括以下内容: - **基础篇**:介绍Netty的基本架构,如ByteBuf(缓冲区)、ChannelFuture和Promise(异步...

    使用jboss netty 创建高性能webservice客户端及服务端

    本篇文章将深入探讨如何利用JBoss Netty创建高效的Web Service客户端和服务端。 首先,我们需要理解Netty的基本工作原理。Netty采用非阻塞I/O模型,基于Java NIO(非阻塞输入/输出)库,允许在网络操作中进行高并发...

    Netty权威指南 PDF电子书 带目录书签 完整版

    本篇文章将深入探讨Netty的关键知识点,帮助读者理解和掌握这一强大的网络编程工具。 1. **Netty概述** - Netty的起源与背景:Netty由JBoss创始人Markus Stenberg发起,旨在提供一个高效、灵活且易于使用的网络...

    基于Netty实现CometStreaming方式的聊天室

    本篇将深入探讨如何利用Netty实现CometStreaming方式的聊天室。 首先,我们要理解CometStreaming是什么。Comet是一种Web技术,它允许服务器向浏览器推送数据,而不是传统的HTTP请求-响应模式。在聊天室场景中,这种...

    Netty开发记录三

    在本篇“Netty开发记录三”中,我们将深入探讨Netty框架的使用,这是一个高效、灵活且可扩展的网络应用程序框架,广泛应用于高性能服务器和客户端的开发。Netty简化了网络编程,提供了异步事件驱动的网络通信模型,...

    Netty权威指南

    Netty 基础篇:java的IO演进之路; BIO ;NIO;伪异步;NIO类库 ; 入门篇:Jetty简单应用入门;...高级篇:Http协议开发; Netty 协议栈开发(数据结构定义,消息编解码,握手安全认证,心跳检测等); WebSocket等

    Java学习之IO总结及mina和netty

    这篇博客“Java学习之IO总结及mina和netty”探讨了Java IO的基础知识,并深入到两个高级网络通信框架——Mina和Netty。Mina和Netty都是基于NIO(非阻塞IO)的高性能网络应用框架,它们简化了复杂网络编程的实现。 *...

    NIO和Netty框架的学习

    本篇文章将深入探讨NIO的基本原理和Netty框架的使用,帮助你从初学者逐渐晋升为高级开发者。 首先,我们来了解**NIO**。NIO是一种与传统的IO模型不同的I/O方式,传统IO基于缓冲区的读写,而NIO则是基于通道...

    javaNetty仿微信源码

    本篇将深入探讨如何利用Java Netty框架来实现类似微信的功能,以及相关的技术细节。 1. **Netty基础** - **非阻塞I/O**:Netty基于NIO(Non-blocking I/O)模型,提高了处理大量连接的能力,特别适合于高并发的...

    java高级编程胶片

    虽然描述部分为空,但根据提供的博客链接(https://xgw123485.iteye.com/blog/1178464),我们可以推测这可能是一个在线分享的资源,博主xgw123485在ITEYE平台上发布了一篇关于Java高级编程的文章或者教程。...

    java开发程序指南进阶篇

    同时,NIO(非阻塞I/O)和异步I/O(AIO)为高性能网络应用提供了可能,如Netty框架就是基于这些概念构建的。 异常处理是Java程序健壮性的保障。通过try-catch-finally语句块,我们可以捕获并处理运行时出现的异常,...

    Java高手真经(网络开发卷)源码

    - Netty框架:高性能的异步事件驱动网络应用框架,可能用于构建高效的网络应用服务器。 6. **性能优化与调试** - 网络延迟优化:源码可能包含如何减少网络延迟,提高网络通信效率的策略。 - 错误处理与日志记录...

    jboss-3.2.5.zip

    本篇文章将详细讲解"jboss-3.2.5.zip"这一版本的JBoss安装、配置及EJBCA的安装和设置过程。 一、JBoss 3.2.5简介 JBoss 3.2.5是在2004年发布的一个版本,它是Java社区的重要里程碑,为开发者提供了轻量级、开源的...

    java高手真经:网络开发卷源码

    7. **Java网络框架**:Spring Boot、Netty、Grizzly等框架简化了网络应用的开发,提供了高级功能如异步处理、性能优化和自定义协议支持。 8. **分布式服务**:Java在分布式计算中的应用,如RMI(Remote Method ...

    Java Socket编程

    这篇博客将深入探讨Java Socket编程的核心概念、用法以及相关工具。 首先,我们来了解Socket的基本概念。Socket可以被看作是网络上的端点,它允许两个应用程序通过Internet进行通信。一个Socket由IP地址和端口号...

Global site tag (gtag.js) - Google Analytics