`

Netty-入门Netty编码

 
阅读更多

在学习Netty编程之前,我们先了解一下为什么要使用Netty, 通过前几篇的代码,大家发现JDK的NIO API太不好用了。JDK自带的API主要有一下4个贴点:

1)      NIO的类库和API繁杂,使用麻烦,你需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等;
2)      需要具备其它的额外技能做铺垫,例如熟悉Java多线程编程,因为NIO编程涉及到Reactor模式,你必须对多线程和网路编程非常熟悉,才能编写出高质量的NIO程序;
3)      可靠性能力补齐,工作量和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流的处理等等,NIO编程的特点是功能开发相对容易,但是可靠性能力补齐工作量和难度都非常大;
4)      JDK NIO的BUG,例如臭名昭著的epoll bug,它会导致Selector空轮询,最终导致CPU 100%。官方声称在JDK1.6版本的update18修复了该问题,但是直到JDK1.7版本该问题仍旧存在,只不过该bug发生概率降低了一些而已,它并没有被根本解决。该BUG以及与该BUG相关的问题单如下:

 

那Netty的主要好处就是以下几点:

1)      API使用简单,开发门槛低;
2)      功能强大,预置了多种编解码功能,支持多种主流协议;
3)      定制能力强,可以通过ChannelHandler对通信框架进行灵活的扩展;
4)      性能高,通过与其它业界主流的NIO框架对比,Netty的综合性能最优;
5)      成熟、稳定,Netty修复了已经发现的所有JDK NIO BUG,业务开发人员不需要再为NIO的BUG而烦恼;
6)      社区活跃,版本迭代周期短,发现的BUG可以被及时修复,同时,更多的新功能会被加入;
7)      经历了大规模的商业应用考验,质量已经得到验证。在互联网、大数据、网络游戏、企业应用、电信软件等众多行业得到成功商用,证明了它可以完全满足不同行业的商业应用。

 

下面就让代码说明一切吧:

 

TimeServer 端主要有两个类完成,Server启动类 和消息处理的Handler

 

package com.techstar.netty;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class NettyTimeServer {

	public void bind(int port) {
		EventLoopGroup bossGroup = new NioEventLoopGroup();
		EventLoopGroup workerGroup = new NioEventLoopGroup();
		try {
			
			ServerBootstrap bootstrap = new ServerBootstrap();
			
			bootstrap.group(bossGroup, workerGroup)
			.channel(NioServerSocketChannel.class)
			.option(ChannelOption.SO_BACKLOG, 1024)
			.childHandler(new ChildChannelHandler());
			
			ChannelFuture syncFuture = bootstrap.bind(port).sync();
			System.out.println("time server listener started!");
			syncFuture.channel().closeFuture().sync();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			bossGroup.shutdownGracefully();
			workerGroup.shutdownGracefully();
		}
		
		
	}
	
	private class ChildChannelHandler extends ChannelInitializer<SocketChannel> {

		@Override
		protected void initChannel(SocketChannel channel) throws Exception {
			channel.pipeline().addLast(new NettyTimeServerHandler());
		}
		
	}
	
	
	/**
	 * 主函数,启动服务器
	 * @param args
	 */
	public static void main(String[] args) {
		
		System.out.println("time server starting..........");
		new NettyTimeServer().bind(8081);
		System.out.println("time server started..........");
	}
}
 

 

 

package com.techstar.netty;

import java.util.Date;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

/**
 * handler
 * @author mrh
 *
 */
public class NettyTimeServerHandler extends SimpleChannelInboundHandler<ByteBuf> {

	@Override
	protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
		// TODO Auto-generated method stub
		
		byte[] req = new byte[msg.readableBytes()];
		msg.readBytes(req);
		
		String body = new String(req, "UTF-8");
		
		System.out.println("The time server receive order : " + body);
		
		String currentTime = "QUERY TIME ORDER".equals(body)?new Date(System.currentTimeMillis()).toString() : "BAD ORDER";
		ByteBuf response = Unpooled.copiedBuffer(currentTime.getBytes());
		
		ctx.write(response);
	}

	@Override
	public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
		// TODO Auto-generated method stub
		ctx.flush();
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		ctx.close();
	}
	
	



	
}
 

 

TimeClient 也是两个类完成, Client启动类和消息处理的Handler

 

 

package com.techstar.netty;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;

public class NettyTimeClient {

	public void connect (String host, int port) {
		EventLoopGroup group = new NioEventLoopGroup();
		
		try {
			Bootstrap bootstrap = new Bootstrap();
			bootstrap.group(group).channel(NioSocketChannel.class)
			.option(ChannelOption.TCP_NODELAY, true)
			.handler(new ChannelInitializer<SocketChannel>() {

				@Override
				protected void initChannel(SocketChannel ch) throws Exception {
					ch.pipeline().addLast(new NettyTimeClientHandler());
					
				}
			});
			
			ChannelFuture future = bootstrap.connect(host, port).sync();
			
			future.channel().closeFuture().sync();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			group.shutdownGracefully();
		}
	}
	
	public static void main(String[] args) {
		new NettyTimeClient().connect("127.0.0.1", 8081);
	}

}

 

 

package com.techstar.netty;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

public class NettyTimeClientHandler extends SimpleChannelInboundHandler<ByteBuf>{

	private final ByteBuf firstMessage;
	
	
	public NettyTimeClientHandler() {
		byte[] request = "QUERY TIME ORDER".getBytes();
		this.firstMessage = Unpooled.buffer(request.length);
		this.firstMessage.writeBytes(request);
	}

	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		ctx.writeAndFlush(firstMessage);
	}
	
	@Override
	protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
		byte[] request = new byte[msg.readableBytes()];
		msg.readBytes(request);
		String body = new String(request, "UTF-8");
		System.out.println(body);
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		// TODO Auto-generated method stub
		cause.printStackTrace();
		ctx.close();
	}

}

 

 示例代码

 

 

分享到:
评论

相关推荐

    掘金-Netty 入门与实战-netty-demo.zip

    这个压缩包“掘金-Netty 入门与实战-netty-demo.zip”包含了关于 Netty 的入门教程和实战示例,特别是通过 "netty-demo-pipeline-channelHandler" 这个文件名我们可以推测,它可能包含了一个展示 Netty ...

    netty入门与实战-netty-learn.zip

    这个“netty入门与实战-netty-learn.zip”文件包含了学习 Netty 的资源,帮助初学者理解并掌握这个强大的网络库。Netty-learn-master 可能是一个包含源代码、教程文档或者示例项目的目录。 Netty 的核心概念: 1. ...

    netty-master.zip

    课程演示源码(附部分中文注释).zip"和"netty-chapter-1-Netty初步印象之HelloWorld.zip"、"netty-chapter-4-Netty案例雏形代码.zip"提供了一系列的示例代码,帮助读者更好地理解和应用Netty,通过实际编码加深对...

    Netty-In-Action中文版.pdf

    6. **编码与解码**:Netty提供了一系列的编解码器,如LengthFieldBasedFrameDecoder用于拆分帧,StringDecoder用于字符串解码,使得处理不同格式的数据变得更加简单。 7. **心跳机制**:Netty支持自定义心跳包,...

    netty-4.0.30.Final.tar.bz2

    2. **高度可定制性**:Netty提供了一系列预定义的ChannelHandler(通道处理器),但同时也允许用户自定义ChannelHandler以满足特定需求,比如实现特定的协议解析或数据编码解码。 3. **丰富的协议支持**:Netty内置...

    netty-in-action中文版

    - **Netty编码器和解码器**:解释Netty中编码器和解码器的具体实现方法。 - **测试编解码器**:提供测试自定义编解码器的有效方法。 ### 第十三部分:EventLoop和线程模型 - **线程模型的总览**:概述Netty中线程...

    netty入门进阶之前

    文件"72-第2章_20-netty入门-jdk-future-480P 清晰-AVC.Cover.jpg"、"73-第2章_21-netty入门-netty-future-480P 清晰-AVC.Cover.jpg"和"74-第2章_22-netty入门-netty-promise-480P 清晰-AVC.Cover.jpg"详细解释了...

    Netty入门教程文档

    Netty入门教程文档 Netty是Java的网络编程框架,广泛应用于数据采集服务中,本文将对Netty的基本概念和应用进行详细介绍,并将其与ETL技术结合,讲解如何使用Netty进行数据流转和处理。 1. ETL概述 ETL(Extract...

    netty的入门经典例子的使用

    这个“netty的入门经典例子的使用”很可能是为了引导初学者了解和掌握 Netty 的基本用法和核心概念。下面将详细阐述 Netty 的基础知识及其在实际应用中的关键点。 首先,Netty 提供了一个高度可定制的事件驱动的...

    Netty大纲-同步netty专栏

    3. **Netty入门** - **概述**:Netty由JBOSS创始人Jochen Meskel开发,它具有高性能、低延迟、易用性等优点,广泛应用于分布式系统、游戏服务器、RPC框架等领域。 - **HelloWorld**:Netty的基本使用包括服务器端...

    Netty入门与实战:仿写微信IM即时通讯系统

    ### Netty入门与实战:仿写微信IM即时通讯系统 #### 一、引言 随着移动互联网技术的飞速发展,即时通讯(IM)系统已成为人们日常生活中不可或缺的一部分。微信作为国内最受欢迎的即时通讯软件之一,其高效稳定的通信...

    netty入门例子--(不是翻译官方文档)

    这个“netty入门例子”旨在帮助初学者理解Netty的基本用法和特性,而不是简单地翻译官方文档,它提供了几个开发模板,以便于深入理解Netty中的消息异步通信机制和TCP通信的封装。 首先,Netty的核心是它的异步模型...

    Netty 入门与实战:仿写微信 IM 即时通讯系统.pdf

    ### Netty 入门与实战:仿写微信 IM 即时通讯系统 #### 一、引言 随着移动互联网技术的飞速发展,即时通讯(IM)应用已成为人们日常生活中不可或缺的一部分。微信作为中国最成功的即时通讯软件之一,其背后的架构和...

    netty-analyse:netty学习记录

    6. **自定义编码解码器**:Netty允许用户自定义编解码器,方便处理各种数据格式,如protobuf、JSON、XML等。 7. **弹性设计**:Netty有很好的扩展性,可以通过添加或修改处理器来适应新的需求。 在“netty-analyse...

    netty快速入门教程9集 共12集

    这个“Netty 快速入门教程9集共12集”提供了宝贵的资源,帮助初学者深入理解并掌握Netty的核心概念和用法。 在本教程中,你将学习到以下关键知识点: 1. **Netty基础架构**:了解Netty的基本组件,如BossGroup、...

    Netty 入门与实战:仿写微信 IM 即时通讯系统.zip

    《Netty 入门与实战:仿写微信 IM 即时通讯系统》是一份专为初学者设计的高质量教程,旨在帮助读者快速掌握Netty框架并应用到实际的即时通讯系统开发中,如仿写微信IM系统。Netty是Java领域内广泛使用的高性能、异步...

    Netty全套学习资源(包括源码、笔记、学习文档等)

    通过阅读源码,我们可以了解到 Netty 如何实现高效的网络通信,例如它的非阻塞 I/O 模型、事件驱动架构、内存池管理以及编码解码器等核心组件。其中,Channel、EventLoop、ByteBuf 等关键类是理解 Netty 的基础,而 ...

    netty从入门到精通所有代码

    这个“Netty 从入门到精通所有代码”压缩包包含了一系列的示例代码,帮助开发者逐步理解并掌握 Netty 的核心概念和实际应用。 1. **Netty 基本概念** - **NIO (Non-blocking I/O)**:Netty 是基于 Java NIO 构建的...

Global site tag (gtag.js) - Google Analytics