nettyserver怎樣解決粘包問題

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

創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設(shè)計制作、網(wǎng)站制作與策劃設(shè)計,豐都網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:豐都等地區(qū)。豐都做網(wǎng)站價格咨詢:13518219792

1、什么是粘包/拆包

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

2、解決辦法

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

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

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

3、netty server端設(shè)置特殊分隔符

  • 注意:分隔符一定要在數(shù)據(jù)處理的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")))     // 設(shè)置線程隊列得到連接個數(shù)
                    .option(ChannelOption.SO_KEEPALIVE, true)  // 設(shè)置保持連接的活動狀態(tài)
                    .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();
            }
        }
    }
}

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。

新聞名稱:nettyserver怎樣解決粘包問題
網(wǎng)頁URL:http://bm7419.com/article4/pcidoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序面包屑導航、網(wǎng)站制作、網(wǎng)站營銷、軟件開發(fā)、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營