慕課網《Netty入門之WebSocket初體驗》學習總結
慕課網《Netty入門之WebSocket初體驗》學習總結
時間:2018年04月11日星期三
說明:本文部分內容均來自慕課網。@慕課網:
教學原始碼:
學習原始碼:
什麼是Netty
高效能、事件驅動、非同步非阻塞的IO Java開源框架
基於NIO的客戶端,服務端程式設計框架
非常可靠的穩定性和伸縮性
Netty使用場景
高效能領域:遊戲、大資料、分散式計算
多執行緒併發領域:多執行緒模型、主從多執行緒模型
非同步通訊領域:非同步非阻塞,主動獲取或透過通知機制來得到結果
課程提綱
IO通訊:BIO、偽非同步IO、NIO、AIO通訊
Netty入門:原生NIO的缺陷、Netty的優勢
WebSocket入門:什麼是WebSocket、如何建立連線、生命週期及關閉
Netty實現WebSocket通訊案例
課程要求
有一定的Java基礎
有一定的IO程式設計基礎
瞭解Java的BIO、偽非同步IO、NIO和AIO
BIO通訊
一個執行緒負責連線
一請求一應答
缺乏彈性伸縮能力
BIO通訊模型
偽非同步IO通訊
執行緒池負責連線
M請求N應答
執行緒池阻塞
偽非同步IO通訊模型
NIO通訊
緩衝區Buffer
通道Channel
多路複用器Selector
AIO通訊
連線註冊讀寫事件和回撥函式
讀寫方法非同步
主動通知程式
四種IO對比
原生NIO的缺陷
類庫和API繁雜
入門門檻高
工作量和難度大
JDK NIO存在BUG
Netty的優勢
API使用簡單,定製能力強,可以透過ChannelHandler對框架進行靈活的擴充套件
入門門檻低,功能強大,預製了多種編解碼功能,支援多種主流協議
效能高,透過與其他的業界主流的NIO框架對比,Netty的綜合效能最優
Netty比較成熟穩定,Netty修復了JDK NIO所有發現的BUG
什麼是WebSocket
H5協議規範:H5提出的協議規範
握手機制:使客戶端與伺服器能夠建立類似TCP的連線,方便通訊
解決客戶端與服務端實時通訊而產生的技術:基於TCP的協議
WebSocket的優點
節省通訊開銷:以前使用輪詢,開銷較大
伺服器主動傳送資料給客戶端:任意時刻,相互傳送資料
實時通訊:可以彼此相互推送資訊
WebSocket建立連線
客戶端發起握手請求
伺服器響應請求
連線建立
WebSocket生命週期
開啟事件:發生新的連線時呼叫、在端點上建立連線時且在任何事件之前
訊息事件:接收WebSocket對話中,另一端傳送的訊息
錯誤事件:在進行連線或端點發生錯誤時產生
關閉事件:表示WebSocket端點的連線關閉
WebSocket關閉連線
伺服器關閉底層TCP連線
客戶端發起TCP Close
基於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
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通訊案例
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1727/viewspace-2800290/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Netty 入門初體驗Netty
- 慕課網《探秘Spring AOP》學習總結Spring
- 慕課網Python入門練習題---Python
- 慕課網go語言體系課搶先體驗Go
- Flutter學習之入門和體驗Flutter
- Netty從入門到禿頭: websocketNettyWeb
- 慕課網10小時大資料入門筆記大資料筆記
- 初入門Python學習之概念區分Python
- Netty 框架學習 —— 新增 WebSocket 支援Netty框架Web
- 深入學習Netty(4)——Netty程式設計入門Netty程式設計
- 慕課 玩轉資料結構 從入門到進階 (草稿)資料結構
- thinkphp開發 網易雲課堂-線上IT學習|視訊教程|慕課網PHP
- 【初學者必備】網路安全學習經驗彙總!
- 深度學習--Tensorflow初體驗深度學習
- Knative 初體驗:CICD 極速入門
- 韓語學習經驗總結,給韓語初學者指路
- 慕課網玩轉資料結構課程之陣列資料結構陣列
- Java IO學習筆記八:Netty入門Java筆記Netty
- iOS初學之填坑總結iOS
- 【MySQL精品學習資源合集】含入門課程、學習筆記、運維經驗總結(建議收藏!!)MySql筆記運維
- Web前端入門的學習路線總結Web前端
- 神經網路與深度學習 課程複習總結神經網路深度學習
- go語言學習初體驗Go
- create-react-app+mobx入門初體驗ReactAPP
- 小白入門微服務(1) - RPC 初體驗微服務RPC
- 如何初學Python,Python入門難嗎?-開課吧Python
- 初入門學習python有哪些用途?Python
- Android 長連線初體驗(基於netty)AndroidNetty
- JavaScript(轉載自 計科學院 慕課網)JavaScript
- netty系列之:使用netty搭建websocket客戶端NettyWeb客戶端
- netty系列之:使用netty搭建websocket伺服器NettyWeb伺服器
- 怎麼學習CAD?初學CAD如何入門
- 慕課網招聘golang講師Golang
- 【Python學習筆記1】Python網路爬蟲初體驗Python筆記爬蟲
- JMeter測試WebSocket的經驗總結JMeterWeb
- 攝像頭 ISP 除錯的入門之談(經驗總結)除錯
- 《文獻管理與資訊分析》慕課學習心得
- 小程式 網易雲課堂雲開發初體驗