中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

netty server怎樣解決粘包問題

發布時間:2021-12-06 16:55:27 來源:億速云 閱讀:203 作者:柒染 欄目:大數據

netty server怎樣解決粘包問題,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

1、什么是粘包/拆包

一般所謂的TCP粘包是在一次接收數據不能完全地體現一個完整的消息數據。TCP通訊為何存在粘包呢?主要原因是TCP是以流的方式來處理數據,再加上網絡上MTU的往往小于在應用處理的消息數據,所以就會引發一次接收的數據無法滿足消息的需要,導致粘包的存在。處理粘包的唯一方法就是制定應用層的數據通訊協議,通過協議來規范現有接收的數據是否滿足消息數據的需要。

2、解決辦法

2.1、消息定長,報文大小固定長度,不夠空格補全,發送和接收方遵循相同的約定,這樣即使粘包了通過接收方編程實現獲取定長報文也能區分。

2.2、包尾添加特殊分隔符,例如每條報文結束都添加回車換行符(例如FTP協議)或者指定特殊字符作為報文分隔符,接收方通過特殊分隔符切分報文區分。

2.3、將消息分為消息頭和消息體,消息頭中包含表示信息的總長度(或者消息體長度)的字段

3、netty server端設置特殊分隔符

  • 注意:分隔符一定要在數據處理的handler之前指定

@Component
public class NettyServer {
    @Value("${netty.server.port}")
    private int port;
    /**
     * 啟動 netty server
     * @throws InterruptedException
     */
    public void start() {
        EventLoopGroup parentGroup = new NioEventLoopGroup();
        EventLoopGroup childGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(parentGroup, childGroup)
                    .channel(NioServerSocketChannel.class)
                    .option(ChannelOption.SO_BACKLOG, Integer.parseInt(CommonUtils.getConfig("ChannelOption.SO_BACKLOG")))     // 設置線程隊列得到連接個數
                    .option(ChannelOption.SO_KEEPALIVE, true)  // 設置保持連接的活動狀態
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) {
                            // 注意消息分隔符處理的handler一定要在消息處理邏輯前面
                            ByteBuf buf = Unpooled.copiedBuffer("\t", Charset.defaultCharset());//自定義拆包字符
                            //(1024)解碼的幀的最大長度,false(拆包是否去掉指定字符),buf(拆包字符)
                            DelimiterBasedFrameDecoder delimiterBasedFrameDecoder = new DelimiterBasedFrameDecoder(1400, true, buf);
                            ch.pipeline().addLast(delimiterBasedFrameDecoder);
                            ch.pipeline().addLast(new NettyServerHandler2());
                        }
                    });
            ChannelFuture channelFuture = serverBootstrap.bind(port).sync();
            channelFuture.channel().closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            try {
                parentGroup.shutdownGracefully().sync();
                childGroup.shutdownGracefully().sync();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

格尔木市| 江西省| 清原| 涟水县| 南靖县| 手游| 伊宁市| 阳原县| 融水| 兰考县| 朝阳市| 措美县| 嘉兴市| 泸州市| 康保县| 双辽市| 襄樊市| 长宁县| 太谷县| 平舆县| 巴南区| 旺苍县| 宣武区| 东城区| 基隆市| 彰化县| 大荔县| 柯坪县| 富蕴县| 徐闻县| 雷州市| 安阳县| 新巴尔虎左旗| 集安市| 印江| 德昌县| 鹿邑县| 五原县| 黔西县| 五寨县| 类乌齐县|