一. linkmaster
1. websocket實現
使用netty實現
ChannelPipeline pipeline = ch.pipeline(); // 因為使用http協議, 需要 http解碼器 pipeline.addLast(new ChannelHandler[]{new HttpServerCodec()}); // 以塊方式寫, 新增 chunkedWriter 處理器 pipeline.addLast(new ChannelHandler[]{new ChunkedWriteHandler()}); /** * 說明: * 1. http資料在傳輸過程中是分段的,HttpObjectAggregator可以把多個段聚合起來; * 2. 這就是為什麼當瀏覽器傳送大量資料時,就會發出多次 http請求的原因 */ pipeline.addLast(new HttpObjectAggregator(8192)); /** * 說明: * 1. 對於 WebSocket,它的資料是以幀frame 的形式傳遞的; * 2. 可以看到 WebSocketFrame 下面有6個子類 * 3. 瀏覽器傳送請求時: ws://localhost:7000/hello 表示請求的uri * 4. WebSocketServerProtocolHandler 核心功能是把 http協議升級為 ws 協議,保持長連線; * 是透過一個狀態碼 101 來切換的 */ pipeline.addLast(new WebSocketServerProtocolHandler("/")); //30 秒客戶端沒有向服務端傳送心跳則關閉連線,後面是寫,和讀寫 pipeline.addLast(new IdleStateHandler(30, 0, 0)); /** 心跳處理,如果觸發了空閒Idle事件,就會處理。透過繼承 ChannelInboundHandlerAdapter的userEventTriggered 實現,需要判斷觸發事件 evt instanceof IdleStateEvent 和 狀態 event.state() == IdleState.READER_IDLE */ pipeline.addLast(new ChannelHandler[]{new HeartBeatHandler(this.properties)}); /** 自定義訊息處理器,繼承SimpleChannelInboundHandler<WebSocketFrame> 的 channelRead0方法 需要判斷訊息是否為文字 WebSocketFrame frame instanceof TextWebSocketFrame */ pipeline.addLast(new ChannelHandler[]{new TextMessageHandler()});
2.具體過程
客戶端傳送訊息json格式,需要傳clientId和type,type0握手,1心跳,2關閉連線,其他自定義