時間:2018年04月11日星期三
說明:本文部分內容均來自慕課網。@慕課網:https://www.imooc.com
教學源碼:https://github.com/zccodere/s...
學習源碼:https://github.com/zccodere/s...
什么是Netty
高性能、事件驅動、異步非阻塞的IO Java開源框架
基于NIO的客戶端,服務端編程框架
非常可靠的穩定性和伸縮性
Netty使用場景
高性能領域:游戲、大數據、分布式計算
多線程并發領域:多線程模型、主從多線程模型
異步通信領域:異步非阻塞,主動獲取或通過通知機制來得到結果
課程提綱
IO通信:BIO、偽異步IO、NIO、AIO通信
Netty入門:原生NIO的缺陷、Netty的優勢
WebSocket入門:什么是WebSocket、如何建立連接、生命周期及關閉
Netty實現WebSocket通信案例
課程要求
有一定的Java基礎
有一定的IO編程基礎
了解Java的BIO、偽異步IO、NIO和AIO
第二章:IO通信 2-1 IO通信BIO通信
一個線程負責連接
一請求一應答
缺乏彈性伸縮能力
BIO通信模型
偽異步IO通信
線程池負責連接
M請求N應答
線程池阻塞
偽異步IO通信模型
NIO通信
緩沖區Buffer
通道Channel
多路復用器Selector
AIO通信
連接注冊讀寫事件和回調函數
讀寫方法異步
主動通知程序
四種IO對比
第三章:Netty入門 3-1 Netty入門原生NIO的缺陷
類庫和API繁雜
入門門檻高
工作量和難度大
JDK NIO存在BUG
Netty的優勢
API使用簡單,定制能力強,可以通過ChannelHandler對框架進行靈活的擴展
入門門檻低,功能強大,預制了多種編解碼功能,支持多種主流協議
性能高,通過與其他的業界主流的NIO框架對比,Netty的綜合性能最優
Netty比較成熟穩定,Netty修復了JDK NIO所有發現的BUG
第四章:WebSocket入門 4-1 WebSocket入門什么是WebSocket
H5協議規范:H5提出的協議規范
握手機制:使客戶端與服務器能夠建立類似TCP的連接,方便通信
解決客戶端與服務端實時通信而產生的技術:基于TCP的協議
WebSocket的優點
節省通信開銷:以前使用輪詢,開銷較大
服務器主動傳送數據給客戶端:任意時刻,相互傳送數據
實時通信:可以彼此相互推送信息
WebSocket建立連接
客戶端發起握手請求
服務器響應請求
連接建立
WebSocket生命周期
打開事件:發生新的連接時調用、在端點上建立連接時且在任何事件之前
消息事件:接收WebSocket對話中,另一端發送的消息
錯誤事件:在進行連接或端點發生錯誤時產生
關閉事件:表示WebSocket端點的連接關閉
WebSocket關閉連接
服務器關閉底層TCP連接
客戶端發起TCP Close
第五章:通信案例 5-1 通信案例基于Netty實現WebSocket通信案例
功能介紹
Netty開發服務端
Html實現客戶端
實現服務端與客戶端的實時交互
代碼編寫
1.創建名為netty-websocket的maven工程pom如下
4.0.0 com.myimooc netty-websocket 0.0.1-SNAPSHOT io.netty netty-all 5.0.0.Alpha1 org.apache.maven.plugins maven-compiler-plugin 1.8 UTF-8
2.編寫NettyConfig類
package com.myimooc.netty.websocket; import io.netty.channel.group.ChannelGroup; import io.netty.channel.group.DefaultChannelGroup; import io.netty.util.concurrent.GlobalEventExecutor; /** *
* 標題: Netty 全局配置類
* 描述: 存儲整個工程的全局配置
* * @author zc * @date 2018/04/11 */ public class NettyConfig { /** * 存儲每一個客戶端接入進來時的 Channel */ public static ChannelGroup group = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); }
3.編寫MyWebSocketHandler類
package com.myimooc.netty.websocket; 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.*; import io.netty.handler.codec.http.websocketx.*; import io.netty.util.CharsetUtil; import java.util.Date; /** *
* 標題: 處理客戶端WebSocket請求的核心業務處理類
* 描述: 接收/處理/響應 客戶端websocket請求的核心業務處理類
* * @author zc * @date 2018/04/11 */ public class MyWebSocketHandler extends SimpleChannelInboundHandler
4.編寫MyWebSocketChannelHandler類
package com.myimooc.netty.websocket; import io.netty.channel.ChannelHandler; 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 zc * @date 2018/04/11 */ public class MyWebSocketChannelHandler extends ChannelInitializer{ @Override protected void initChannel(SocketChannel ch) throws Exception { // 將請求和應答消息解碼為HTTP消息 ch.pipeline().addLast("http-codec",new HttpServerCodec()); // 將HTTP消息的多個部分合成一條完整的HTTP消息 ch.pipeline().addLast("aggregator",new HttpObjectAggregator(65536)); // 向客戶端發送HTML5文件 ch.pipeline().addLast("http-chunked", new ChunkedWriteHandler()); ch.pipeline().addLast("handler",new MyWebSocketHandler()); } }
5.編寫AppStart類
package com.myimooc.netty.websocket; 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; import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; /** *
* 標題: 程序入口
* 描述: 啟動應用
* * @author zc * @date 2018/04/11 */ public class AppStart { public static void main(String[] args) { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workGroup = new NioEventLoopGroup(); try { ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup,workGroup); serverBootstrap.channel(NioServerSocketChannel.class); serverBootstrap.childHandler(new MyWebSocketChannelHandler()); System.out.println("服務端開啟等待客戶端連接..."); Channel channel = serverBootstrap.bind(8888).sync().channel(); channel.closeFuture().sync(); }catch (Exception e){ e.printStackTrace(); }finally { // 優雅的退出程序 bossGroup.shutdownGracefully(); workGroup.shutdownGracefully(); } } }
6.編寫websocket.html
WebSocket客戶端
課程總結
課程介紹
IO通信:四種IO通信
Netty入門:原生NIO的缺點,Netty的優點
WebSocket入門:WebSocket的優點,如何使用
通信案例:Netty實現WebSocket通信案例
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69093.html
摘要:是一個持久化的協議,相對于這種非持久的協議來說。最大的特點就是實現全雙工通信客戶端能夠實時推送消息給服務端,服務端也能夠實時推送消息給客戶端。參考鏈接知乎問題原理原理知乎問題編碼什么用如果文章有錯的地方歡迎指正,大家互相交流。 前言 今天在慕課網上看到了Java的新教程(Netty入門之WebSocket初體驗):https://www.imooc.com/learn/941 WebS...
摘要:時間年月日星期四說明本文部分內容均來自慕課網。倉庫構建鏡像的目的是為了在其機器上運行鏡像程序。使用參數,冒號前面為主機端口,后面為容器端口。 時間:2017年04月27日星期四說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學示例源碼:無個人學習源碼:無 第一章:課程介紹 1-1 課程介紹 Docker能火的原因 快速的持續集成 服務的彈性伸縮 部署...
閱讀 1050·2021-11-22 15:35
閱讀 1685·2021-10-26 09:49
閱讀 3230·2021-09-02 15:11
閱讀 2075·2019-08-30 15:53
閱讀 2636·2019-08-30 15:53
閱讀 2916·2019-08-30 14:11
閱讀 3527·2019-08-30 12:59
閱讀 3241·2019-08-30 12:53