国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

使用 LineBasedFrameDecoder 和 StringDecoder 解決半包粘包問題

HollisChuang / 2572人閱讀

摘要:修改之前的服務端開發代碼修改為下面代碼綁定端口同步等待成功等待服務端監聽端口關閉主要修改了和方法和原理分析的工作原理是它依次遍歷中的可讀字節判斷看是否有或如果有就以此位置為結束位置從可讀索引到結束位置區間的字節就組成了一行它是以換行符為結束

修改之前的 Netty 服務端開發 代碼, 修改為下面代碼

public class TimeServer {

    public void bind(int port) throws Exception {

        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .option(ChannelOption.SO_BACKLOG, 1024)
                    .childHandler(new ChildChannelHandler());

            // 綁定端口, 同步等待成功
            ChannelFuture f = b.bind(port).sync();

            // 等待服務端監聽端口關閉
            f.channel().closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }

    private class ChildChannelHandler extends ChannelInitializer {

        @Override
        protected void initChannel(SocketChannel ch) throws Exception {
            ch.pipeline().addLast(new LineBasedFrameDecoder(1024));
            ch.pipeline().addLast(new StringDecoder());
            ch.pipeline().addLast(new TimeServerHandler());
        }
    }

    private class TimeServerHandler extends ChannelHandlerAdapter {
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
            ctx.close();
        }

        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
            String body = (String) msg;
            System.out.println(body);

            ByteBuf resp = Unpooled.copiedBuffer("6666".getBytes());
            ctx.write(resp);
        }

        @Override
        public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
            ctx.flush();
        }
    }

}

主要修改了 initChannelchannelRead 方法.

LineBasedFrameDecoder 和 StringDecoder 原理分析

LineBasedFrameDecoder 的工作原理是它依次遍歷 ByteBuf 中的可讀字節, 判斷看是否有 , 如果有, 就以此位置為結束位置, 從可讀索引到結束位置區間的字節就組成了一行.

它是以換行符為結束標志的解碼器, 支持攜帶結束符或者不攜帶結束符兩種解碼方式, 同時支持配置單行的最大長度. 如果連續讀取到最大長度后仍然沒有發現換行符, 就會拋出異常, 同時忽略之前讀到的異常碼流.

StringDecoder 的功能非常簡單, 就是將收到的對象轉換成字符串, 然后繼續調用后面Handler.

LineBasedFrameDecoder + StringDecoder 組合就是按行切換的文本解碼器, 它被設計用來支持 TCP 的粘包和拆包.

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72740.html

相關文章

  • 基于定長消息的java nio半包粘包處理

    摘要:接收方只需要等待,直到讀到確定數量的字節,然后處理即可。而這個字節流的前個字節用于表示對象的長度,接下來的字節就是傳輸的對象的字節流,最后不夠最大長度的用任意字節進行填充即可。 什么是tcp半包粘包?簡單來講就是接收到的tcp包并不一定是一個完整的包。它可能是1個包的一部分,也可能是多個完整包加上1個包的一部分。為什么?因為tcp的定義是面向字節流的傳輸協議,所以操作系統實現這個協議的...

    Loong_T 評論0 收藏0
  • Netty(三) 什么是 TCP 拆、粘包?如何解決?

    摘要:是一個面向字節流的協議,它是性質是流式的,所以它并沒有分段??苫诜指舴鉀Q。編解碼的主要目的就是為了可以編碼成字節流用于在網絡中傳輸持久化存儲。 showImg(https://segmentfault.com/img/remote/1460000015895049); 前言 記得前段時間我們生產上的一個網關出現了故障。 這個網關邏輯非常簡單,就是接收客戶端的請求然后解析報文最后發送...

    YanceyOfficial 評論0 收藏0
  • 分隔符定長解碼器的應用

    摘要:以流的方式進行數據傳輸上層的應用協議為了對消息進行區分往往采用如下中方式消息長度固定累計讀取到長度總和為定長的報文后就認為讀到了一個完整的消息將計數器置位重新開始讀取下一個數據報將回車換行符作為消息結束符例如協議這種方式在文本協議中應用比較 TCP 以流的方式進行數據傳輸, 上層的應用協議為了對消息進行區分, 往往采用如下 4 中方式. 消息長度固定, 累計讀取到長度總和為定長 LE...

    lemon 評論0 收藏0
  • netty

    摘要:設置每個數據包的大小如個字節,如果某個數據包不足個字節可能會出現丟包的情況,即該數據包未從一個端到另一個端,此時需要用空格或者既定的符號補充在數據包之間使用一些字符進行分割如號之類的,解析的時候先處理掉分隔符再拿到各個數據包就好了。 netty 概念: Netty是由JBOSS提供的一個java開源框架。Netty提供異步的、事件驅動的網絡應用程序框架和工具,用以快速開發高性能、高可靠...

    cfanr 評論0 收藏0
  • 徹底理解Netty,這一篇文章就夠了

    摘要:如果什么事都沒得做,它也不會死循環,它會將線程休眠起來,直到下一個事件來了再繼續干活,這樣的一個線程稱之為線程。而請求處理邏輯既可以使用單獨的線程池進行處理,也可以跟放在讀寫線程一塊處理。 Netty到底是什么 從HTTP說起 有了Netty,你可以實現自己的HTTP服務器,FTP服務器,UDP服務器,RPC服務器,WebSocket服務器,Redis的Proxy服務器,MySQL的P...

    yy13818512006 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<