zoukankan      html  css  js  c++  java
  • WebSocket接收大数据时,分片帧的处理

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.SimpleChannelInboundHandler;
    import io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame;
    import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame;
    import io.netty.handler.codec.http.websocketx.ContinuationWebSocketFrame;
    import io.netty.handler.codec.http.websocketx.PongWebSocketFrame;
    import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
    import io.netty.handler.codec.http.websocketx.WebSocketFrame;
    
    
    public class WebSocketHandlerDemo extends SimpleChannelInboundHandler<WebSocketFrame>{
        private static final Logger logger = LoggerFactory.getLogger(WebSocketHandlerDemo.class);
        
        StringBuilder frameBuffer = new StringBuilder();
    
        /**
         * 收到信息
         */
        @Override
        protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame msg) throws Exception {
            
            WebSocketFrame frame = (WebSocketFrame) msg;
            logger.info("Received incoming frame [{}]", frame.getClass().getName());
            
            if (frame instanceof CloseWebSocketFrame) {
                logger.info("【PIS-client】 received CloseWebSocketFrame");
                if (frameBuffer != null) {
                    handleMessageCompleted(ctx, frameBuffer.toString());
                }
                frameBuffer = null;
                return;
            } else if (frame instanceof PongWebSocketFrame) {
                logger.info("【PIS-client】 received pong");
                return;
            } else if (frame instanceof BinaryWebSocketFrame) {
                logger.info("【PIS-client】 received Binary");
                return;
            }
    
            // 判断、拼接数据帧给frameBuffer
            if (frame instanceof TextWebSocketFrame) {
                frameBuffer = new StringBuilder();
                TextWebSocketFrame textFrame = (TextWebSocketFrame) frame;
                String text = textFrame.text();
                logger.info("【PIS-client】收到 TextWebSocketFrame message:{}", text);
                frameBuffer.append(text);
            } else if (frame instanceof ContinuationWebSocketFrame) {
                ContinuationWebSocketFrame continuationWebSocketFrame = (ContinuationWebSocketFrame) frame;
                String cwsText = continuationWebSocketFrame.text();
                logger.info("【PIS-client】 收到 ContinuationWebSocketFrame ,value:{}", cwsText);
                if (frameBuffer != null) {
                    frameBuffer.append(cwsText);
                } else {
                    logger.warn("【PIS-client】未接收初始帧的延续帧  .");
                }
            } else {
                logger.warn("【PIS-client】 收到不支持的帧: {}", frame.toString());
                return;
            }
    
            // 检查是否是最后一帧
            if (frame.isFinalFragment()) {
                handleMessageCompleted(ctx, frameBuffer.toString());
                frameBuffer = null;
            }
            
        }
        
        /**
         * 业务处理
         */
        protected void handleMessageCompleted(ChannelHandlerContext ctx, String msg) throws Exception {
            logger.info("收到消息:{}",msg);
        }
        
    }
  • 相关阅读:
    CSS边框,背景,边距,溢出
    数字电子技术课程设计之基于触发器的三位二进制同步减法计数器无效态000/110
    集成电路版图与工艺课程设计之用CMOS实现Y=AB+C电路与版图
    金属磁记忆传感器封装
    基于FPGA 的8b10b编解码电路前端电路设计
    Css颜色和文本字体
    Css中的选择器
    Css基本语法及页面引用
    65 插入排序
    63 散列表的查找
  • 原文地址:https://www.cnblogs.com/LinTianwen/p/15528017.html
Copyright © 2011-2022 走看看