91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

乌海市| 楚雄市| 桐庐县| 方城县| 翼城县| 右玉县| 岳阳县| 九江县| 唐河县| 涞水县| 漳平市| 瓮安县| 玉门市| 上思县| 施甸县| 柞水县| 尚义县| 呼伦贝尔市| 西青区| 营口市| 安新县| 陇西县| 兴文县| 青神县| 利辛县| 义马市| 灵丘县| 韩城市| 郴州市| 梅河口市| 台安县| 达孜县| 舞阳县| 临西县| 策勒县| 招远市| 江城| 长沙市| 前郭尔| 东辽县| 阳新县|