專案

好友33發表於2024-09-02

一. 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關閉連線,其他自定義

  

相關文章