`
liuzhengqiu0127
  • 浏览: 7363 次
  • 性别: 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电子书下载 带目录书签 完整版

    本篇文章将深入探讨 Netty 的核心概念、特性以及其在实际开发中的应用。 Netty 框架由 Java 编写,它提供了一套丰富的预构建的组件,如协议解码器、编码器、处理程序和管道,这些组件可以帮助开发者快速、高效地...

    Netty案例集锦(并发编程篇)

    ### Netty案例集锦(并发编程篇) #### Netty的特点 Netty因其高效且易于使用的特性而被广泛采用。其特点主要包括: 1. **简洁的API封装**:Netty简化了复杂的网络通信过程,通过诸如`Bootstrap`这样的工具类进行...

    Netty教程用户手册

    - **1.9 应用程序关闭**:了解如何优雅地关闭Netty应用程序。 - **1.10 总结**:回顾本章所学的主要内容。 **2. 架构概述** - **2.1 丰富的缓冲数据结构**:Netty提供了高效的缓冲机制,能够更好地管理数据。 - **...

    深入浅出Netty

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

    Netty最容易懂的实例和教材

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

    Netty_in_Action(第五版目录修正)

    5. **构建第一个Netty应用** 6. **Netty从底层构建** 7. **传输层** 8. **缓冲区** 9. **通道处理器(Channel Handler)** 10. **编解码(Codec)** 11. **提供的通道处理器和编解码器** 12. **启动Netty应用程序** 13. ...

    使用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)的高性能网络应用框架,它们简化了复杂网络编程的实现。 *...

    netty documentation

    ### Netty文档知识点详解 #### 一、Netty概述与问题背景 - **Netty**是一种高性能、异步事件驱动的网络应用框架及工具包...无论是对于初学者还是高级开发者而言,Netty都是构建高效、可扩展网络应用程序的理想选择。

    NIO和Netty框架的学习

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

    从NIO到NETTY简述.pptx(培训)

    总结来说,从NIO到Netty,我们看到的是从底层I/O模型到高级通信框架的发展,Netty通过封装复杂的网络编程细节,提供了高效、易用的解决方案,极大地简化了开发者的任务,提升了应用的性能和稳定性。

Global site tag (gtag.js) - Google Analytics