最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Netty編碼器和解碼器

 更新時間:2021年06月07日 10:34:06   作者:_tommy  
很多小伙伴對Netty編解碼器這方面不是很了解,今天這篇文章給大家詳細(xì)介紹了Netty編碼器和解碼器的相關(guān)知識,需要的朋友可以參考下

一、java的編解碼

1.編碼(Encode)稱為序列化, 它將對象序列化為字節(jié)數(shù)組,用于網(wǎng)絡(luò)傳輸、數(shù)據(jù)持久化或者其它 用途。

2.解碼(Decode)稱為反序列化,它把從網(wǎng)絡(luò)、磁盤等讀取的字節(jié)數(shù)組還原成原始對象(通常是原 始對象的拷貝),以方便后續(xù)的業(yè)務(wù)邏輯操作。

image-20210605230045944

java序列化對象只需要實現(xiàn)java.io.Serializable接口并生成序列化ID,這個類就能夠通過 java.io.ObjectInput和java.io.ObjectOutput序列化和反序列化。

java序列化對象只需要實現(xiàn)java.io.Serializable接口并生成序列化ID,這個類就能夠通過 java.io.ObjectInput和java.io.ObjectOutput序列化和反序列化。

Java序列化目的:1.網(wǎng)絡(luò)傳輸。2.對象持久化。

Java序列化缺點:1.無法跨語言。 2.序列化后碼流太大。3.序列化性能太低。

Java序列化僅僅是Java編解碼技術(shù)的一種,由于它的種種缺陷,衍生出了多種編解碼技術(shù)和框 架,這些編解碼框架實現(xiàn)消息的高效序列化。

二、Netty編解碼器

概念:在網(wǎng)絡(luò)應(yīng)用中需要實現(xiàn)某種編解碼器,將原始字節(jié)數(shù)據(jù)與自定義的消息對象進行互相轉(zhuǎn)換。網(wǎng)絡(luò)中都是以字節(jié)碼的數(shù)據(jù)形式來傳輸數(shù)據(jù)的,服務(wù)器編碼數(shù)據(jù)后發(fā)送到客戶端,客戶端需要對數(shù)據(jù)進行解碼。

對于Netty而言,編解碼器由兩部分組成:編碼器、解碼器

  • 解碼器:負(fù)責(zé)將消息從字節(jié)或其他序列形式轉(zhuǎn)成指定的消息對象。
  • 編碼器:將消息對象轉(zhuǎn)成字節(jié)或其他序列形式在網(wǎng)絡(luò)上傳輸。

Netty 的編(解)碼器實現(xiàn)了 ChannelHandlerAdapter,也是一種特殊的 ChannelHandler,所 以依賴于 ChannelPipeline,可以將多個編(解)碼器鏈接在一起,以實現(xiàn)復(fù)雜的轉(zhuǎn)換邏輯。

Netty里面的編解碼: 解碼器:負(fù)責(zé)處理“入站 InboundHandler”數(shù)據(jù)。 編碼器:負(fù)責(zé)“出站 OutboundHandler” 數(shù)據(jù)。

入棧解碼,出棧編碼:

2.1 解碼器(Decoder)

解碼器負(fù)責(zé) 解碼“入站”數(shù)據(jù)從一種格式到另一種格式,解碼器處理入站數(shù)據(jù)是抽象 ChannelInboundHandler的實現(xiàn)。需要將解碼器放在ChannelPipeline中。對于解碼器,Netty中主要提供了抽象基類ByteToMessageDecoder和MessageToMessageDecoder。

image-20210605231024070

抽象解碼器

ByteToMessageDecoder: 用于將字節(jié)轉(zhuǎn)為消息,需要檢查緩沖區(qū)是否有足夠的字節(jié)

ReplayingDecoder: 繼承ByteToMessageDecoder,不需要檢查緩沖區(qū)是否有足夠的字節(jié),但 是 ReplayingDecoder速度略慢于ByteToMessageDecoder,同時不是所有的ByteBuf都支持。 項目復(fù)雜性高則使用ReplayingDecoder,否則使用ByteToMessageDecoder

MessageToMessageDecoder: 用于從一種消息解碼為另外一種消息(例如POJO到POJO)

核心方法

decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out)

2.2 代碼實現(xiàn)

 MessageDecoder

package com.my.codec;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageDecoder;
import io.netty.util.CharsetUtil;

import java.util.List;

/**
 * 消息解碼器
 */
public class MessageDecoder extends MessageToMessageDecoder {
    @Override
    protected void decode(ChannelHandlerContext ctx, Object msg, List out) throws Exception {
        System.out.println("正在進行消息解碼....");
        ByteBuf byteBuf = (ByteBuf) msg;
        out.add(byteBuf.toString(CharsetUtil.UTF_8));//傳遞到下一個handler
    }
}

NettyServerHandler

nettyServerHandler 實現(xiàn)ChannelInboundHandler, 重新若干方法。

通道讀取方法:

/**
     * 通道讀取事件
     *
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("客戶端發(fā)送過來的消息:" + msg);
    }

服務(wù)端在接收客戶端的消息時,首先會經(jīng)過MessageDecoder編碼器,將字節(jié)變?yōu)樽址?,因此,在此處可直接輸出?/p>

NettyServer

serverBootstrap.group(bossGroup, workerGroup)
                .channel(NioServerSocketChannel.class)
                .option(ChannelOption.SO_BACKLOG, 128)
                .childOption(ChannelOption.SO_KEEPALIVE, Boolean.TRUE)
                .childHandler(new ChannelInitializer<SocketChannel>() { 
                    @Override
                    protected void initChannel(SocketChannel ch) throws Exception {
                        //添加解碼器
                        ch.pipeline().addLast("messageDecoder", new MessageDecoder());
                        //向pipeline中添加自定義業(yè)務(wù)處理handler
                        ch.pipeline().addLast(new NettyServerHandler());
                    }
                });

在pipeline中添加解碼器

2.3 編碼器(Encoder)

與ByteToMessageDecoder和MessageToMessageDecoder相對應(yīng),Netty提供了對應(yīng)的編碼器 實現(xiàn)MessageToByteEncoder和MessageToMessageEncoder,二者都實現(xiàn) ChannelOutboundHandler接口。

image-20210605232231876

抽象編碼器

MessageToByteEncoder: 將消息轉(zhuǎn)化成字節(jié)MessageToMessageEncoder: 用于從一種消息編碼為另外一種消息(例如POJO到POJO)

核心方法:

encode(ChannelHandlerContext ctx, String msg, List<Object> out)

2.4 代碼實現(xiàn)

MessageEncoder

package com.my.codec;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageEncoder;
import io.netty.util.CharsetUtil;

import java.util.List;

/**
 * 消息的編碼器
 */
public class MessageEncoder extends MessageToMessageEncoder {
    @Override
    protected void encode(ChannelHandlerContext ctx, Object msg, List out) throws Exception {
        System.out.println("消息正在進行編碼....");
        String str = (String) msg;
        out.add(Unpooled.copiedBuffer(str, CharsetUtil.UTF_8));
    }
}

NettyClientHandler

/**
     * 通道就緒事件
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        ChannelFuture future = ctx.writeAndFlush("你好呀.我是Netty客戶端");
        future.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture future) throws Exception {
                if (future.isSuccess()) {
                    System.out.println("數(shù)據(jù)發(fā)送成功!");
                } else {
                    System.out.println("數(shù)據(jù)發(fā)送失敗!");
                }
            }
        });
    }

    /**
     * 通道讀就緒事件
     *
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("服務(wù)端發(fā)送的消息:" + msg);
    }

當(dāng)客戶端通道準(zhǔn)備就緒時,會向服務(wù)端發(fā)送 “你好呀.我是Netty客戶端”,由于出棧是逆序的,因此,直接傳入字符串,當(dāng)出棧時,會經(jīng)過編碼器(在nettyclient中添加的)

NettyClient

bootstrap.group(group)
                .channel(NioSocketChannel.class)
                .handler(new ChannelInitializer<SocketChannel>() { 
                    @Override
                    protected void initChannel(SocketChannel ch) throws Exception {
                        //添加解碼器
                        ch.pipeline().addLast("messageDecoder", new MessageDecoder());
                        //添加編碼器
                        ch.pipeline().addLast("messageEncoder", new MessageEncoder());                  
                        //向pipeline中添加自定義業(yè)務(wù)處理handler
                        ch.pipeline().addLast(new NettyClientHandler());
                    }
                });

同時,在NettyServerHandler 中也添加相同的編解碼器。

因為是雙向通信,因此,在服務(wù)端和客戶端的pipeline中均需要添加編解碼器。

2.5 測試結(jié)果

服務(wù)端打?。?/p>

image-20210605233932707

客戶端打?。?/p>

image-20210605233943017

三、編碼解碼器Codec

編碼解碼器:

同時具有編碼與解碼功能,特點同時實現(xiàn)了ChannelInboundHandler和 ChannelOutboundHandler接口,因此在數(shù)據(jù)輸入和輸出時都能進行處理。

image-20210605234135527

Netty提供提供了一個ChannelDuplexHandler適配器類,編碼解碼器的抽象基類

ByteToMessageCodec ,MessageToMessageCodec都繼承與此類

3.1 代碼實現(xiàn):

package com.my.codec;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageCodec;
import io.netty.util.CharsetUtil;

import java.util.List;

/**
 * 消息編解碼器
 */
public class MessageCodec extends MessageToMessageCodec {
    /**
     * 編碼
     *
     * @param ctx
     * @param msg
     * @param out
     * @throws Exception
     */
    @Override
    protected void encode(ChannelHandlerContext ctx, Object msg, List out) throws Exception {
        System.out.println("消息正在進行編碼....");
        String str = (String) msg;
        out.add(Unpooled.copiedBuffer(str, CharsetUtil.UTF_8));
    }

    /**
     * 解碼
     *
     * @param ctx
     * @param msg
     * @param out
     * @throws Exception
     */
    @Override
    protected void decode(ChannelHandlerContext ctx, Object msg, List out) throws Exception {
        System.out.println("正在進行消息解碼....");
        ByteBuf byteBuf = (ByteBuf) msg;
        out.add(byteBuf.toString(CharsetUtil.UTF_8));//傳遞到下一個handler
    }
}

NettyServer、NettyClient

在NettyServer和NettyClient中添加

ch.pipeline().addLast(new MessageCodec());
//8. 向pipeline中添加自定義業(yè)務(wù)處理handler
ch.pipeline().addLast(new NettyServerHandler());

eBuf = (ByteBuf) msg;
out.add(byteBuf.toString(CharsetUtil.UTF_8));//傳遞到下一個handler
}
}

ch.pipeline().addLast(new MessageCodec());
//8. 向pipeline中添加自定義業(yè)務(wù)處理handler
ch.pipeline().addLast(new NettyServerHandler());

測試結(jié)果與1.2.5測試結(jié)果一致

到此這篇關(guān)于詳解Netty編碼器和解碼器的文章就介紹到這了,更多相關(guān)Netty編解碼器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java獲取用戶訪問IP及地理位置的方法詳解

    Java獲取用戶訪問IP及地理位置的方法詳解

    這篇文章主要介紹了Java獲取用戶訪問IP及地理位置的方法,結(jié)合實例形式詳細(xì)分析了Java基于百度地圖開放平臺獲取用戶訪問IP及地理位置相關(guān)操作技巧,需要的朋友可以參考下
    2020-04-04
  • 淺談 java中ArrayList、Vector、LinkedList的區(qū)別聯(lián)系

    淺談 java中ArrayList、Vector、LinkedList的區(qū)別聯(lián)系

    ArrayList,Vector底層是由數(shù)組實現(xiàn),LinkedList底層是由雙線鏈表實現(xiàn),從底層的實現(xiàn)可以得出性能問題ArrayList,Vector插入速度較慢,查詢速度較快,而LinkedList插入速度較快,而查詢速度較慢。再者由于Vevtor使用了線程安全鎖,所以ArrayList的運行效率高于Vector
    2015-11-11
  • java實現(xiàn)角色及菜單權(quán)限的項目實踐

    java實現(xiàn)角色及菜單權(quán)限的項目實踐

    在Java中,實現(xiàn)角色及菜單權(quán)限管理涉及定義實體類、設(shè)計數(shù)據(jù)庫表、實現(xiàn)服務(wù)層和控制器層,這種管理方式有助于有效控制用戶權(quán)限,適用于企業(yè)級應(yīng)用,感興趣的可以一起來了解一下
    2024-09-09
  • springboot2學(xué)習(xí)世界著名程序springboot開發(fā)體驗

    springboot2學(xué)習(xí)世界著名程序springboot開發(fā)體驗

    這篇文章主要為大家介紹了世界著名程序springboot開發(fā)體驗,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • SpringBoot項目部署到服務(wù)器的兩種方式

    SpringBoot項目部署到服務(wù)器的兩種方式

    目前,前后端分離的架構(gòu)已成主流,而使用SpringBoot構(gòu)建Web應(yīng)用是非??焖俚?項目發(fā)布到服務(wù)器上的時候,只需要打成一個jar包,然后通過命令 : java -jar jar包名稱即可啟動服務(wù)了,本文介紹了SpringBoot項目部署到服務(wù)器的兩種方式,需要的朋友可以參考下
    2024-10-10
  • 全局請求添加TraceId輕松看日志

    全局請求添加TraceId輕松看日志

    這篇文章主要為大家介紹了全局請求添加TraceId,更加方便輕松的看日志,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Java中的線程中斷機制和LockSupport詳解

    Java中的線程中斷機制和LockSupport詳解

    這篇文章主要介紹了Java中的線程中斷機制和LockSupport詳解,在Java中沒有辦法立即停止一條線程,然而停止線程卻顯得尤為重要,如取消一個耗時操作,因此,Java提供了一種用于停止線程的協(xié)商機制中斷,也即中斷標(biāo)識協(xié)商機制,需要的朋友可以參考下
    2023-09-09
  • Java三目運算符用法舉例

    Java三目運算符用法舉例

    三目運算符是我們經(jīng)常在代碼中使用的,這篇文章主要給大家介紹了關(guān)于Java三目運算符用法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Java算法比賽常用方法實例總結(jié)

    Java算法比賽常用方法實例總結(jié)

    這篇文章主要給大家介紹了關(guān)于Java算法比賽常用方法實例總結(jié)的相關(guān)資料,文中給出了詳細(xì)的實例介紹的非常詳細(xì),對大家學(xué)習(xí)java算法具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-05-05
  • springboot使用com.github.binarywang包實現(xiàn)微信網(wǎng)頁上的支付和退款

    springboot使用com.github.binarywang包實現(xiàn)微信網(wǎng)頁上的支付和退款

    最近做項目需要實現(xiàn)在pc端需要實現(xiàn)微信的支付,本文主要介紹了springboot使用com.github.binarywang包實現(xiàn)微信網(wǎng)頁上的支付和退款,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05

最新評論

芦山县| 武功县| 揭阳市| 化德县| 来宾市| 辽中县| 灵台县| 玛纳斯县| 牡丹江市| 张家口市| 永修县| 精河县| 土默特左旗| 新昌县| 黎平县| 乌鲁木齐县| 潍坊市| 临泽县| 莱芜市| 秭归县| 皋兰县| 海原县| 衡东县| 简阳市| 东城区| 余干县| 垦利县| 贵阳市| 梅河口市| 长宁区| 顺义区| 临泉县| 星子县| 赤城县| 洪泽县| 启东市| 阳城县| 松桃| 和林格尔县| 克什克腾旗| 屏山县|