您好,登錄后才能下訂單哦!
netty server怎樣解決粘包問題,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
一般所謂的TCP粘包是在一次接收數據不能完全地體現一個完整的消息數據。TCP通訊為何存在粘包呢?主要原因是TCP是以流的方式來處理數據,再加上網絡上MTU的往往小于在應用處理的消息數據,所以就會引發一次接收的數據無法滿足消息的需要,導致粘包的存在。處理粘包的唯一方法就是制定應用層的數據通訊協議,通過協議來規范現有接收的數據是否滿足消息數據的需要。
2.1、消息定長,報文大小固定長度,不夠空格補全,發送和接收方遵循相同的約定,這樣即使粘包了通過接收方編程實現獲取定長報文也能區分。
2.2、包尾添加特殊分隔符,例如每條報文結束都添加回車換行符(例如FTP協議)或者指定特殊字符作為報文分隔符,接收方通過特殊分隔符切分報文區分。
2.3、將消息分為消息頭和消息體,消息頭中包含表示信息的總長度(或者消息體長度)的字段
注意:分隔符一定要在數據處理的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(); } } } }
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。