1. netty

         netty是一个提供了易于使用的api的客户端/服务端框架,传输快、零拷贝(会开辟一个新堆内存,数据从io直接到堆内存),并发高,采用nio(同步非阻塞io)。

         阻塞和非阻塞:线程访问资源,该资源是否准备就绪的一种处理方式。

         同步和异步:访问数据的一种机制。

          nio由三个核心部分组成:buffer(缓冲区)、channel(通道)、selector(多路复用器)。多路复用器是一个线程,会主动轮询,客户端和服务端建立连接时,进行注册,完毕后有个channel,channel是个双向通道,会进行相应数据的读写,到buffer缓冲区。

2. io 比较   

           bio(同步阻塞io):服务器实现模式一个连接一个线程,发起请求--->一直阻塞--->处理完成。

           nio(同步非阻塞io):  服务器实现模式一个请求一个线程, selector主动轮询channel--->处理请求--->处理完成。

           aio(异步非阻塞io):  服务器实现模式一个有效请求一个线程,发起请求--->通知回调feature对象。

3. 三种线程模型

          单线程模型:所有的io操作都由同一个nio线程处理的。

          多线程模型:由一组nio线程处理io操作。

          主从线程模型:一组线程池接受请求,一组线程池处理io。

 

 

4. 实时通信

          Ajax轮询:每隔一段时间会向服务器发送请求,死循环,浏览器不刷新。

          Long pull: 阻塞的模型,直到服务器返回结果,客户端才会发送下一请求。这两种比较耗资源,性能不好。

          Websocket:协议,http不支持长连接,基于http协议,服务器和客户端会一直保持连接,服务器为客户端服务,会主动推送消息,是持久化的。

          api :       

          Var socket = new WebSocket(“ws ://[ip]:[port]”)

         生命周期 : onopen()  onmessage()  onerror()  onclose()

         主动方法 Socket.send()  Socket.close()

5. 实例

//定义一对线程组
//主线程组,用于接收客户端的请求,但是不做任何处理,跟老板一样不做事
EventLoopGroup bossGroup = new NioEventLoopGroup();
//从线程组,老板线程组会把任务交给它,让手下线程组去做任务
EventLoopGroup workGroup = new NioEventLoopGroup();


//netty服务器的创建,ServerBootstrap是一个启动类
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup,workGroup) //设置主从线程组
.channel(NioServerSocketChannel.class) //设置nio通道
.childHandler(new HelloServerInitializer());//子处理器,用于处理workGroup

//启动server,并且设置8088为启动的端口号,同时启动方式为同步
ChannelFuture channelFuture = serverBootstrap.bind(8088).sync();
//用于监听关闭的channel,设置为同步
channelFuture.channel().closeFuture().sync();


HelloServerInitializer类继承ChannelInitializer,在initChannel中的方法的代码如下:
//通过socketChannel 获得对应的管道
ChannelPipeline pipeline = socketChannel.pipeline();
//通过管道添加handler
//HttpServerCodec是由netty自己提供的助手类,可以理解为拦截器
//当请求到服务端,我们需要做解码,响应到客户端做编码
pipeline.addLast("HttpServerCodec",new HttpServerCodec());

//添加自定义的助手类
pipeline.addLast("customHandler",new MyHandler());

编写自定义助手类MyHandler,继承SimpleChannelInboundHandler

protected void channelRead0(ChannelHandlerContext channelHandlerContext, HttpObject httpObject) throws Exception {
//获取channel
   Channel channel =  channelHandlerContext.channel();
if (httpObject instanceof HttpRequest){
//显示客户端的远程地址
       channel.remoteAddress()
       //定义发送的数据消息
ByteBuf byteBuffer = Unpooled.copiedBuffer("hello netty", CharsetUtil.UTF_8);
//构建一个http response
FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK,byteBuffer);

//把响应刷到客户端
channelHandlerContext.writeAndFlush(response);
}

-----------------------------------------------------------------------------------------------------

本文部分参考慕课网 : Netty/Spring Boot仿微信聊天全栈实战 教程

 

posted on 2019-07-15 20:17  jeolyli  阅读(682)  评论(0编辑  收藏  举报