1. 程式人生 > >Netty固定長度解碼器的使用

Netty固定長度解碼器的使用

專案結構

服務端

package com.nio.fixed.server;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.FixedLengthFrameDecoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;

public class EchoServer {
    public void bind(int port) throws Exception{
        // 配置服務端的NIO執行緒
        NioEventLoopGroup groupBig = new NioEventLoopGroup();
        NioEventLoopGroup groupSmall  = new NioEventLoopGroup();

        try {
            ServerBootstrap bootstrap = new ServerBootstrap();
            bootstrap.group(groupBig,groupSmall)
                    .channel(NioServerSocketChannel.class)
                    .option(ChannelOption.SO_BACKLOG,100)
                    .handler(new LoggingHandler(LogLevel.INFO))
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel socketChannel) throws Exception {
                            socketChannel.pipeline().addLast(new FixedLengthFrameDecoder(20));
                            socketChannel.pipeline().addLast(new StringDecoder());
                            socketChannel.pipeline().addLast(new EchoServerHandler());
                        }
                    });
            // 繫結埠,同步等待成功
            ChannelFuture future = bootstrap.bind(port).sync();
            // 等待服務端監聽埠關閉
            future.channel().closeFuture().sync();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            // 退出,釋放資源
           groupBig.shutdownGracefully();
           groupSmall.shutdownGracefully();
        }
    }

    public static void main(String[] args)throws Exception {
        int port = 8056;
        if (args != null && args.length > 0){
            try {
                port = Integer.valueOf(args[0]);
            }catch (NumberFormatException e){
                e.printStackTrace();
            }
        }
        new EchoServer().bind(port);
    }
}
package com.nio.fixed.server;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

public class EchoServerHandler extends ChannelInboundHandlerAdapter {
    int counter = 0;

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        // 列印接收到的訊息
        System.out.println("服務端的計數器:" + ++counter + "  ,客戶端發來的訊息是:【 " + msg + "】");

    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }

}

客戶端使用Telnet:

【1】解決Telnet命令不能使用問題

輸入命令:

回車輸入要給服務端傳送的訊息:

執行結果:

固定了長度,當輸入的碼流大於指定的長度就會發送給服務端進行輸出

Netty分隔符解碼器的使用

相關推薦

Netty固定長度解碼的使用

專案結構 服務端 package com.nio.fixed.server; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.ByteBuf; import io.netty.buf

netty原始碼閱讀之解碼值基於固定長度解碼分析

固定長度解碼器FixedLengthFrameDecoder比較簡單,我們看下它類的註釋: /** * A decoder that splits the received {@link ByteBuf}s by the fixed number * of bytes.

Netty原始碼分析第6章(解碼)---->第2節: 固定長度解碼

  Netty原始碼分析第六章: 解碼器   第二節: 固定長度解碼器   上一小節我們瞭解到, 解碼器需要繼承ByteToMessageDecoder, 並重寫decode方法, 將解析出來的物件放入集合中集合, ByteToMessageDecoder中可以將解析出

Netty中LineBasedFrameDecoder解碼使用與分析:解決TCP粘包問題

ring public xpl cep ctx new 綁定端口 註意 相關 [toc] Netty中LineBasedFrameDecoder解碼器使用與分析:解決TCP粘包問題 上一篇文章《Netty中TCP粘包問題代碼示例與分析》演示了使用了時間服務器的例子演示了T

Netty中分隔符解碼代碼示例與分析

rac ride 通用 否則 eventloop connect href throw java [toc] Netty中分隔符解碼器代碼示例與分析 通過特別解碼器的使用,可以解決Netty中TCP的粘包問題,上一篇《Netty中LineBasedFrameDecoder

netty的編解碼介紹

本blog主要介紹: 1. Codec 編解碼器 2. Decoder 解碼器 3. Encoder 編碼器 netty提供了強大的編解碼器框架,使得我們編寫自定義的編解碼器很容易,也容易封裝重用。 在網路應用中需要實現某種編解碼器,將原始位元組資料與

netty 5 (2)解碼

    在上個例子中為了解決粘包拆包問題設定解碼器,先來看看LengthFieldBasedFrameDecoder:    LengthFieldBasedFrameDecoder()方法是decoder實現,也是LengthFieldBasedFrameDecoder建

netty原始碼閱讀之解碼之基於長度解碼引數分析

這篇文章我們放鬆一點,只分析基於長度域解碼器的幾個引數, lengthFieldOffset :長度域的偏移量,也就是長度域要從什麼地方開始 lengthFieldLength:長度域的長度,也就是長度域佔多少個位元組 lengthAdjustment:長度域的值的調整

netty原始碼閱讀之解碼之基於長度解碼分析

基於長度域解碼器LengthFieldBasedFrameDecoder我們主要分析以下三點: 1、計算需要抽取的資料包的長度 2、跳過位元組邏輯處理 3、丟棄模式下的處理 首先原始碼還是LengthFieldBasedFrameDecoder的decode方法:

Netty中定長解碼的使用

ble 解碼器 erb cau option bootstra cef 成功 ios [toc] Netty中定長解碼器的使用 有了前面的基礎,定長解碼器的使用相對就比較簡單了,所以這裏只使用服務端的代碼,測試時,用telnet作為客戶客戶端,數據只作單向的發送,即從客戶

Netty入門(六)Decoder(解碼

err 器) repl 方法 pub HA override 異常 oid   Netty 提供了豐富的解碼器抽象基類,主要分為兩類: 解碼字節到消息(ByteToMessageDecoder 和 ReplayingDecoder) 解碼消息到消息(MessageTo

netty解碼和粘包拆包

exception med 增加 這就是 就會 邊界 ali 空格 封裝 Tcp是一個流的協議,一個完整的包可能會被Tcp拆成多個包進行發送,也可能把一個小的包封裝成一個大的數據包發送,這就是所謂的粘包和拆包問題 粘包、拆包出現的原因: 在流傳輸中出現,UDP不會出現粘包,

Netty 解碼抽象父類 ByteToMessageDecoder 源碼解析

cep 轉換 cached 運算 ont 直接 小細節 message TP 前言 Netty 的解碼器有很多種,比如基於長度的,基於分割符的,私有協議的。但是,總體的思路都是一致的。 拆包思路:當數據滿足了 解碼條件時,將其拆開。放到數組。然後發送到業務 handler

netty解碼詳解(小白也能看懂!)

什麼是編解碼器?   首先,我們回顧一下netty的元件設計:Netty的主要元件有Channel、EventLoop、ChannelFuture、ChannelHandler、ChannelPipe等。 ChannelHandler   ChannelHandler充當了處理入站和出站

netty使用msgpack自定義編解碼實現序列化操作

匯入依賴 <dependency> <groupId>org.msgpack</groupId> <artifactId>msgpack</artifactId>

Netty(預置的ChannelHandler和編解碼)

通過SSL/TLS保護Netty應用程式     為了支援SSL/TLS,Java提供了javax.net.ssl包,它的SSLContext和SSLEngine類使得實現解密和加密相當簡單直接。Netty通過一個名為SslHandler的ChannelHand

Netty(編解碼框架)

    每個網路應用程式都必須定義如何解析在兩個節點之間來回傳輸的原始位元組,以及如何將其和目標應用程式的資料格式做相互轉換。這種轉換邏輯由編解碼器處理,編解碼器  由編碼器和解碼器組成,它們每種都可以將位元組流從一種格式轉換為另一種格式。  

Netty 整合 MessagePack 序列化框架 + LengthFieldBasedFrameDecoder 自定義解碼

環境準備及說明  如果是匯入二進位制開發包,則如下所示: 需要開發包的可以參考《 MessagePack 開發入門詳解》。 如果是 Maven 專案,則新增如下依賴: <!-- https://mvnrepository.com/artifact/

Netty學習之路(六)-分隔符和定長解碼的應用

之前已經使用了LineBasedFrameDecoder解決TCP粘包問題,現在再學兩種解決TCP粘包的方法。 DelimiterBasedFrameDecoder:可以自動完成以分隔符做結束標誌的訊息的解碼,分隔符自定義。 FixedLengthFrameDecoder:

netty自定義編碼解碼(粘包處理)

這裡的實現方式是:將訊息分為兩部分,也就是訊息頭和訊息尾,訊息頭中寫入要傳送資料的總長度,通常是在訊息頭的第一個欄位使用int值來標識傳送資料的長度。 首先我們寫一個Encoder,我們繼承自Me