一、前言
1.什么是netty?
高性能,事件驱动,异步非堵塞基于nio的客户端,服务端编程框架(nio的框架)稳定性和伸缩性
2.netty的使用场景。
高性能领域多线程并发领域异步通信领域
3.学习目录
io通信netty入门websocket入门netty实现websocket通信案例
二.java io通信
客户端个数:bio(1:1) 伪异步io(m:n) nio(m:1) aio(m:0)io类型:bio(阻塞同步io) 伪异步io(阻塞同步io) nio(非阻塞同步io) aio(非阻塞异步io)api使用难度:bio(简单) 伪异步io(简单) nio(复杂) aio(复杂,但比nio简单)调试难度:同上可靠性:bio(差) 伪异步io(差) nio(好) aio(好)吞吐量:同上
三.netty入门
1.原生nio的缺陷。类库和api复杂;入门门槛高;工作量和难度大;jdk nio存在bug2.netty的优势。api简单;入门门槛低;性能高;成熟、稳定。
四.websocket入门
1.什么是websocket?h5协议规范;握手机制;解决客户端与服务端实时通信而产生的技术。2.websocket的优点?节省通信开销;服务器主动传送数据给客户端;实时通信;3.websocket建立连接。客户端发起握手请求;服务端响应请求;连接建立。4.websocket生命周期。打开事件;消息事件;错误事件;关闭事件。5.websocket关闭连接。服务端关闭底层tcp连接;客户端发起tcp close。
五.netty实现websocket通信案例。
1.功能介绍
netty开发服务端;html实现客户端;实现服务端和客户端的实时交互。
2.代码实现
2.1存储工厂的全局配置
package com.websocket.netty;import io.netty.channel.group.ChannelGroup;import io.netty.channel.group.DefaultChannelGroup;import io.netty.util.concurrent.GlobalEventExecutor;/** * @author lilinshen * @title 存储工厂的全局配置 * @description 请填写相关描述 * @date 2018/5/23 10:32 */public class NettyConfig { /** * 储存每一个客户端进来时的channel对象 */ public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);}
2.2处理/接收/响应客户端websocket请求的核心业务处理类
package com.websocket.netty;import io.netty.buffer.ByteBuf;import io.netty.buffer.Unpooled;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelFutureListener;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.SimpleChannelInboundHandler;import io.netty.handler.codec.http.DefaultFullHttpResponse;import io.netty.handler.codec.http.FullHttpRequest;import io.netty.handler.codec.http.HttpResponseStatus;import io.netty.handler.codec.http.HttpVersion;import io.netty.handler.codec.http.websocketx.*;import io.netty.util.CharsetUtil;import java.util.Date;/** * @author lilinshen * @title 处理/接收/响应客户端websocket请求的核心业务处理类 * @description 请填写相关描述 * @date 2018/5/23 10:36 */public class MyWebSocketHandler extends SimpleChannelInboundHandler
3.初始化连接时的各个组件
package com.websocket.netty;import io.netty.channel.ChannelInitializer;import io.netty.channel.socket.SocketChannel;import io.netty.handler.codec.http.HttpObjectAggregator;import io.netty.handler.codec.http.HttpServerCodec;import io.netty.handler.stream.ChunkedWriteHandler;/** * @author lilinshen * @title 初始化连接时的各个组件 * @description 请填写相关描述 * @date 2018/5/23 11:12 */public class MyWebSocketChannelHander extends ChannelInitializer{ @Override protected void initChannel(SocketChannel socketChannel) throws Exception { socketChannel.pipeline().addLast("http-codec", new HttpServerCodec()); socketChannel.pipeline().addLast("aggregator", new HttpObjectAggregator(65536)); socketChannel.pipeline().addLast("http-chunked", new ChunkedWriteHandler()); socketChannel.pipeline().addLast("handler", new MyWebSocketHandler()); }}
4.程序的入口,负责启动应用
package com.websocket.netty;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.Channel;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.nio.NioServerSocketChannel;/** * @author lilinshen * @title 程序的入口,负责启动应用 * @description 请填写相关描述 * @date 2018/5/23 11:17 */public class Main { public static void main(String[] args) { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workGroup = new NioEventLoopGroup(); try { ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup, workGroup); bootstrap.channel(NioServerSocketChannel.class); bootstrap.childHandler(new MyWebSocketChannelHander()); System.out.println("服务端开启等待客户端连接..."); Channel channel = bootstrap.bind(8888).sync().channel(); channel.closeFuture().sync(); } catch (Exception e) { e.printStackTrace(); } finally { // 优雅的退出程序 bossGroup.shutdownGracefully(); workGroup.shutdownGracefully(); } }}
5.websocket.html客户端代码。
websocket客户端
6.启动。
1.main.java类是程序的入口,负责启动应用。
2.将websocket.html在浏览器中打开,就可以建立一个websocket连接。