亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

郓城县| 米脂县| 平湖市| 定远县| 大港区| 英超| 营山县| 西乌珠穆沁旗| 措美县| 和龙市| 同仁县| 衡阳县| 托里县| 东山县| 会同县| 肃北| 澎湖县| 林甸县| 宁阳县| 中方县| 新龙县| 五指山市| 克山县| 阿拉善左旗| 宜州市| 钦州市| 绩溪县| 湖州市| 延长县| 石阡县| 东阳市| 车致| 永城市| 洪泽县| 昆明市| 云梦县| 启东市| 安顺市| 婺源县| 博湖县| 寿宁县|