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
一般所謂的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.1、消息定長,報文大小固定長度,不夠空格補全,發(fā)送和接收方遵循相同的約定,這樣即使粘包了通過接收方編程實現(xiàn)獲取定長報文也能區(qū)分。
2.2、包尾添加特殊分隔符,例如每條報文結(jié)束都添加回車換行符(例如FTP協(xié)議)或者指定特殊字符作為報文分隔符,接收方通過特殊分隔符切分報文區(qū)分。
2.3、將消息分為消息頭和消息體,消息頭中包含表示信息的總長度(或者消息體長度)的字段
注意:分隔符一定要在數(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)