`

Netty学习:搭建一个简单的Netty服务

阅读更多

Netty学习:搭建一个简单的Netty服务

Netty 是一个基于 JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞、基于事件驱动、高性能、高可靠性和高可定制性。换句话说,Netty是一个NIO框架,使用它可以简单快速地开发网络应用程序,比如客户端和服务端的协议。Netty大大简化了网络程序的开发过程比如TCP和UDP的 Socket的开发。Netty 已逐渐成为 Java NIO 编程的首选框架。

项目官方地址:http://netty.io/index.html

一. Netty 的优点:

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

二. 搭建Netty服务:

  1. 添加pom依赖
    <dependency>
    	<groupId>io.netty</groupId>
    	<artifactId>netty-all</artifactId>
    	<version>4.1.0.Final</version>
    </dependency>
     
  2. SimpleServer(服务端)
    package com.yingjun.netty.server;
    
    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;
    
    /**
     * 
     * Netty中,通讯的双方建立连接后,会把数据按照ByteBuf的方式进行传输,
     * 例如http协议中,就是通过HttpRequestDecoder对ByteBuf数据流进行处理,转换成http的对象。
     * 
     */
    public class SimpleServer {
    	private int port;
    
    	public SimpleServer(int port) {
    		this.port = port;
    	}
    
    	public void run() throws Exception {
    		//EventLoopGroup是用来处理IO操作的多线程事件循环器
    		//bossGroup 用来接收进来的连接
    		EventLoopGroup bossGroup = new NioEventLoopGroup(); 
    		//workerGroup 用来处理已经被接收的连接
    		EventLoopGroup workerGroup = new NioEventLoopGroup();
    		try {
    			//启动 NIO 服务的辅助启动类
    			ServerBootstrap b = new ServerBootstrap(); 
    			b.group(bossGroup, workerGroup)
    				//配置 Channel
    				.channel(NioServerSocketChannel.class)
    				.childHandler(new ChannelInitializer<SocketChannel>() { 
    						@Override
    						public void initChannel(SocketChannel ch) throws Exception {
    							// 注册handler  
    							ch.pipeline().addLast(new SimpleServerHandler());
    						}
    					})
    				.option(ChannelOption.SO_BACKLOG, 128) 
    				.childOption(ChannelOption.SO_KEEPALIVE, true); 
    
    			// 绑定端口,开始接收进来的连接
    			ChannelFuture f = b.bind(port).sync();
    			// 等待服务器 socket 关闭 。
    			f.channel().closeFuture().sync();
    		} finally {
    			workerGroup.shutdownGracefully();
    			bossGroup.shutdownGracefully();
    		}
    	}
    	
    	public static void main(String[] args) throws Exception {
            new SimpleServer(9999).run();
        }
    }
    
     
  3. SimpleServerHandler(服务端请求处理Handler)
    package com.yingjun.netty.server;
    
    import io.netty.buffer.ByteBuf;
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.ChannelInboundHandlerAdapter;
    
    public class SimpleServerHandler extends ChannelInboundHandlerAdapter {
    
    	@Override
    	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    		System.out.println("SimpleServerHandler.channelRead");
    		ByteBuf result = (ByteBuf) msg;
    		byte[] result1 = new byte[result.readableBytes()];
    		// msg中存储的是ByteBuf类型的数据,把数据读取到byte[]中
    		result.readBytes(result1);
    		String resultStr = new String(result1);
    		// 接收并打印客户端的信息
    		System.out.println("Client said:" + resultStr);
    		// 释放资源,这行很关键
    		result.release();
    
    		// 向客户端发送消息
    		String response = "hello client!";
    		// 在当前场景下,发送的数据必须转换成ByteBuf数组
    		ByteBuf encoded = ctx.alloc().buffer(4 * response.length());
    		encoded.writeBytes(response.getBytes());
    		ctx.write(encoded);
    		ctx.flush();
    	}
    
    	@Override
    	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    		// 当出现异常就关闭连接
    		cause.printStackTrace();
    		ctx.close();
    	}
    
    	@Override
    	public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
    		ctx.flush();
    	}
    
    }
    
     
  4. SimpleServer(客户端)
    package com.yingjun.netty.server;
    
    import io.netty.bootstrap.Bootstrap;
    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;
    import io.netty.channel.socket.nio.NioSocketChannel;
    
    public class SimpleClient {
    	
    	public void connect(String host, int port) throws Exception {
    		EventLoopGroup workerGroup = new NioEventLoopGroup();
    
    		try {
    			Bootstrap b = new Bootstrap();
    			b.group(workerGroup);
    			b.channel(NioSocketChannel.class);
    			b.option(ChannelOption.SO_KEEPALIVE, true);
    			b.handler(new ChannelInitializer<SocketChannel>() {
    				@Override
    				public void initChannel(SocketChannel ch) throws Exception {
    					ch.pipeline().addLast(new SimpleClientHandler());
    				}
    			});
    
    			// Start the client.
    			ChannelFuture f = b.connect(host, port).sync();
    
    			// Wait until the connection is closed.
    			f.channel().closeFuture().sync();
    		} finally {
    			workerGroup.shutdownGracefully();
    		}
    	}
    	
    	public static void main(String[] args) throws Exception {
    		SimpleClient client=new SimpleClient();
    		client.connect("127.0.0.1", 9999);
    	}
    	
    }
    
     
  5. SimpleServerHandler(客户端请求处理Handler)
    package com.yingjun.netty.server;
    
    import io.netty.buffer.ByteBuf;
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.ChannelInboundHandlerAdapter;
    
    public class SimpleClientHandler extends ChannelInboundHandlerAdapter {
    
    	@Override
    	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    		System.out.println("SimpleClientHandler.channelRead");  
            ByteBuf result = (ByteBuf) msg;  
            byte[] result1 = new byte[result.readableBytes()];  
            result.readBytes(result1);  
            System.out.println("Server said:" + new String(result1));  
            result.release();  
    	}
    
    	@Override
    	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    		// 当出现异常就关闭连接
    		cause.printStackTrace();
    		ctx.close();
    	}
    
    	
    	// 连接成功后,向server发送消息  
        @Override  
        public void channelActive(ChannelHandlerContext ctx) throws Exception {  
        	String msg = "hello Server!";  
            ByteBuf encoded = ctx.alloc().buffer(4 * msg.length());  
            encoded.writeBytes(msg.getBytes());  
            ctx.write(encoded);  
            ctx.flush();  
        }  
    }
    
     
  6. 运行结果:

    SimpleClientHandler.channelRead
    Server said:hello client!
    ------------------------------------------
    SimpleServerHandler.channelRead
    Client said:hello Server!
    SimpleServerHandler.channelRead
    Client said:hello Server!
     
3
0
分享到:
评论
4 楼 wosyingjun 2016-06-07  
文昌平蓝杰 写道
我觉得虽然基本的用法都在了,可是netty的使用带来的好处没有在代码中体现

后面还会介绍。。。
3 楼 文昌平蓝杰 2016-06-06  
我觉得虽然基本的用法都在了,可是netty的使用带来的好处没有在代码中体现
2 楼 cywhoyi 2016-06-06  
nj_first 写道
能讲解一下Netty如何实现UDP吗?

都是基于reactor的方式实现的,netty比起自己写nio的服务轻松很多,不过也有地雷要踩下,用得不好memory泄漏常事,基础开发主要从handler codc造轮子
1 楼 nj_first 2016-06-06  
能讲解一下Netty如何实现UDP吗?

相关推荐

    Netty通信服务器搭建demo

    - LengthFieldBasedFrameDecoder:一个预定义的解码器,可以根据数据包长度字段来自动拆包。 5. **示例代码片段**: ```java public class NettyServer { public static void main(String[] args) throws ...

    Netty初探:掌握高性能网络通信框架,提升Java网络编程技能

    Netty 是一个专门为高性能网络应用设计的异步事件驱动的网络应用程序框架,它极大地简化了Java网络编程。Netty 在解决JDK自带的NIO API使用复杂性方面表现出色,提供了一套高度封装且功能丰富的API,使得开发者可以...

    使用netty+spring搭建游戏框架

    综上所述,搭建一个Netty+Spring的游戏框架需要理解两个框架的核心原理,并将其特性融合到游戏服务的各个层面。通过这样的框架,可以构建出稳定、高效的网络游戏服务器。如果你对这个主题感兴趣,可以参考给定的博文...

    springboot+netty开发简易式游戏源码

    在本项目中,"springboot+netty开发简易式游戏源码"是一个使用Spring Boot和Netty框架构建的轻量级游戏服务器的示例。这个项目结合了两个强大的技术,旨在提供一个高效、可扩展的游戏后端解决方案。下面将详细阐述...

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

    在深入学习Netty的基础上,教程将引导读者实现一个简单的即时通讯系统,类似于微信的聊天功能。这包括用户注册登录、消息发送与接收、群组管理等多个模块。这一部分将涉及到如何使用Netty处理TCP连接,实现可靠的...

    Netty实战 电子版.pdf_java_netty_服务器_

    2. **Channel与Pipeline**:Netty中的Channel代表一个网络连接,负责读写数据。Pipeline(管道)则是一系列处理通道事件的处理器链,每个处理器可以对数据进行解码、编码或者执行业务逻辑。 3. **ByteBuf**:Netty...

    netty学习教程

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个“netty学习教程”压缩包包含了19个PDF文档,旨在全面介绍Netty的基础知识以及实际应用。以下是根据这些...

    springboot+netty实现mqtt协议的broken

    将Spring Boot与Netty结合,可以创建一个微服务,该服务能够作为MQTT代理,处理客户端的连接、订阅、发布消息等操作。项目中的代码可能包括以下几个关键部分: 1. MQTT服务器端点配置:使用Netty构建MQTT服务器,...

    服务端Netty搭建

    在"服务端Netty搭建"这个主题中,我们将深入探讨如何利用Netty来创建一个能够处理文件传输和JSON格式字符串交互的服务端。 首先,Netty的核心概念是基于Reactor模式,它允许服务端同时处理多个客户端连接,而无需为...

    物联网netty服务端和客户端两个项目

    物联网技术在近年来得到了广泛应用,尤其是在智能设备和自动化系统中,Netty作为一个高性能、异步事件驱动的网络应用框架,成为了物联网(IoT)领域的重要工具。本项目包含两个关键部分:Netty服务端和客户端,它们...

    使用netty使用http协议开发文件服务器

    Netty是一个高性能、异步事件驱动的网络应用框架,常用于构建高效的服务器和客户端应用程序,尤其是在高并发场景下。在本示例中,我们将探讨如何使用Netty实现一个基于HTTP协议的文件服务器。 首先,我们需要理解...

    netty网络编程学习文档

    总的来说,这个Netty网络编程学习文档会提供一个全面的视角来理解和应用Netty,从基础的服务器和客户端搭建,到高级的特性利用,再到实战经验分享,都是提升网络编程能力的宝贵资源。通过深入学习和实践,我们可以...

    Spring Boot + Netty 实现温湿度采集的展示

    在本项目中,"Spring Boot + Netty 实现温湿度采集的展示" 是一个结合了Spring Boot微服务框架和Netty高性能网络库的系统,用于实时监控和展示环境中的温湿度数据。这样的系统通常用于物联网(IoT)场景,如智能家居、...

    springboot集成netty,使用protobuf作为数据交换格式,可以用于智能终端云端服务脚手架

    在构建高性能、低延迟的智能终端云端服务时,Spring Boot 和 Netty 的集成是一个非常有效的方法。本项目“springboot-netty-protobuf-master”旨在提供一个基础架构,它利用了Spring Boot的便捷性以及Netty的高效...

    rtmpServer-master_nettyrtmp_rtmp推流_netty开发rtmp_rtmpServer-master

    总的来说,这个项目提供了从零开始构建一个RTMP服务器的参考,可以帮助开发者深入理解RTMP协议以及如何利用Netty构建高性能的网络服务。通过学习和研究这个项目,开发者可以掌握网络编程、实时流媒体传输以及服务器...

    Netty5入门3个简单例子

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨Netty 5的三个...记得参考提供的网站资源,它们将为你的Netty学习之路提供宝贵的支持。

    springboot与netty整合

    SpringBoot以其便捷的依赖管理和自动配置功能简化了Java应用的搭建和部署,而Netty则是一个高效的异步事件驱动的网络应用框架,常用于构建服务器和客户端的通信系统。 首先,我们要理解SpringBoot的核心理念。它...

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

    在IT行业中,网络通信是至关重要的一个环节,特别是在开发分布式系统和Web服务时。JBoss Netty是一个高性能、异步事件驱动的网络应用程序框架,它为快速开发可维护的高性能协议服务器和客户端提供了丰富的API。本篇...

    基于Netty消息框架的Java游戏服务器.zip

    在构建高性能、高并发的游戏服务器时,Netty作为一个强大的异步事件驱动的网络应用程序框架,被广泛应用。"基于Netty消息框架的Java游戏服务器"项目,旨在利用Netty的特性来设计并实现一个高效的游戏服务器。这个...

    Netty开发视频教程

    - **分布式消息队列**:基于Netty实现一个简易的消息队列系统,学习消息队列的基本原理。 #### 六、性能优化技巧 - **零拷贝技术**:避免数据在不同缓冲区之间复制,提高数据传输效率。 - **线程模型优化**:合理...

Global site tag (gtag.js) - Google Analytics