netty: MessageToMessageCodec的用法

一、定义类,继承MessageToMessageCodec,重写encode和decode方法

package cn.edu.tju;import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageCodec;import java.util.List;public class MyMessageToMessageCodec extends MessageToMessageCodec<ByteBuf, String> {@Overrideprotected void encode(ChannelHandlerContext channelHandlerContext, String s, List<Object> list) throws Exception {System.out.println("encode was called......");ByteBuf buf = Unpooled.copiedBuffer(s.getBytes());list.add(buf);}@Overrideprotected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {System.out.println("decode was called......");int length = byteBuf.readableBytes();byte[] bytes = new byte[length];byteBuf.readBytes(bytes);String str = new String (bytes);list.add(str);System.out.println("codec received message: " + str);}
}

二、定义一个简单的ChannelInboundHandlerAdapter

package cn.edu.tju;import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;public class MySimpleHandler2 extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {String str = (String)msg;System.out.println("handler received message: " + msg);ctx.channel().writeAndFlush(str.toUpperCase());}
}

三、定义netty TCP server 主类,在ChannelPipeline中加入上述两个handler

package cn.edu.tju;import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
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.LengthFieldBasedFrameDecoder;
import io.netty.handler.codec.LineBasedFrameDecoder;
import io.netty.handler.codec.string.StringDecoder;import java.net.InetSocketAddress;public class NettyTcpServer11 {public static void main(String[] args) {EventLoopGroup bossGroup = new NioEventLoopGroup(1);EventLoopGroup workerGroup = new NioEventLoopGroup(16);try {ServerBootstrap  serverBootstrap = new ServerBootstrap();serverBootstrap.group(bossGroup, workerGroup);serverBootstrap.channel(NioServerSocketChannel.class);serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline pipeline = ch.pipeline();pipeline.addLast(new MyMessageToMessageCodec());pipeline.addLast(new MySimpleHandler2());}});ChannelFuture channelFuture = serverBootstrap.bind(new InetSocketAddress(8899)).sync();channelFuture.channel().closeFuture().sync();} catch (Exception ex){System.out.println(ex.getMessage());bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}

MessageToMessageCodec的子类可以用@Sharable注解标记。
ByteToMessageCodec的子类不能用@Sharable注解标记,因为在调用构造方法时会判断是否有@Sharable注解,如果有,会报错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/645531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编码风格之(5)GNU软件编码风格(3)

GNU软件编码标准风格(3) Author&#xff1a;Onceday Date: 2024年1月21日 漫漫长路&#xff0c;才刚刚开始… 本文主要翻译自《GNU编码标准》(GNU Coding Standards)一文。 参考文档: Linux kernel coding style — The Linux Kernel documentationGNU Coding Standard…

kotlin $ (字符串模版)的使用

$ 在kotlin 中当做字符串模版使用&#xff0c;作用就是在字符串里面识别自己定义的字符 例如打印一个字符 这个时候编译就提示我们使用字符串模版的是个 $ 的作用就是识别字符串里面的i 字数有点少了&#xff0c;在写一个demo private fun String.appendArchive(): String …

java-集合-List集合

List集合 java.util.List接口,继承自Collection. List集合是可重复集,并且有序,提供了一套可以通过下标操作元素的方法 常用实现类: - java.util.ArrayList:内部使用数组实现,查询性能更好. - java.util.LinkedList:内部使用链表实现,首尾增删元素性能更好. List集合常见方法…

云手机与实体手机的对比

在数字化时代&#xff0c;云手机作为一种虚拟手机在云端服务器上运行&#xff0c;与传统的实体手机相比存在诸多差异。让我们深入探讨云手机与实体手机之间的区别&#xff0c;以便更好地了解它们的特点和优势。 外观上的差异 实体手机具有实际的外观和重量&#xff0c;占据一定…

Spring Boot整合XXL-Job

Spring Boot整合XXL-Job 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将探讨如何在Spring Boot项目中整合XXL-Job&#xff0c;一个分布式任务…

编译安装Nginx和使用五种算法实现Nginx反向代理负载均衡

目录 Ubuntu中安装Nginx 概念介绍 负载均衡 几种负载均衡算法 反向代理 环境规划 配置反向代理 加权负载均衡&#xff08;Weighted Load Balancing&#xff09; 轮询&#xff08;Round Robin&#xff09; IP 哈希&#xff08;IP Hash&#xff09; 最少连接&#xff…

多维时序 | Matlab实现EVO-TCN-Multihead-Attention能量谷算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现EVO-TCN-Multihead-Attention能量谷算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现EVO-TCN-Multihead-Attention能量谷算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资…

Spring5系列学习文章分享---第四篇(JdbcTemplate+概念配置+增删改查数据+批量操作 )

目录 JdbcTemplateJdbcTemplate&#xff08;概念和准备&#xff09;JdbcTemplate 操作数据库&#xff08;新增update&#xff09;JdbcTemplate 操作数据库&#xff08;修改和删除update&#xff09;JdbcTemplate 操作数据库&#xff08;查询返回某个值queryForObject&#xff0…

shopee的AI学习之路——GPTs通过AdInteli 广告变现

GPTs|AdInteli 广告变现 一、什么是 AdInteli AdIntelli 是一个旨在为生成 GPTs 接入广告并实现变现的平台。它连接了全球最大的广告联盟&#xff0c;允许广告商进行竞价&#xff0c;确保展示最有价值的广告。AdIntelli 采用 AI 驱动的收入生成技术&#xff0c;优化广告选择。…

安卓MediaRecorder(4)视频采集编码写入详细源码分析

文章目录 前言视频采集视频编码视频编码写入结语 本文首发地址 https://blog.csdn.net/CSqingchen/article/details/134896821 最新更新地址 https://gitee.com/chenjim/chenjimblog 前言 通过 文2 我们知道了 MediaRecorder 各个接口 Framework 中的实现。 通过 文3 我们 知道…

<网络安全>《5 网络安全产品之网关》

1 基础概念 网关(Gateway)又称网间连接器、协议转换器。 网关在网络层以上实现网络互连&#xff0c;是复杂的网络互连设备&#xff0c;仅用于两个高层协议不同的网络互连。 网关既可以用于广域网互连&#xff0c;也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或…

《游戏-03_3D-开发》之—新输入系统人物移动攻击连击

本次修改unity的新输入输出系统。本次修改unity需要重启&#xff0c;请先保存项目&#xff0c; 点击加号起名为MyCtrl&#xff0c; 点击加号设置为一轴的&#xff0c; 继续设置W键&#xff0c; 保存 生成自动脚本&#xff0c; 修改MyPlayer代码&#xff1a; using UnityEngine;…

华为产业链之车载激光雷达

一、智能汽车 NOA 加快普及&#xff0c;L3 上路利好智能感知硬件 1、感知层是 ADAS 最重要的一环 先进驾驶辅助系统 &#xff08;ADAS&#xff0c; Advanced driver-assistance system&#xff09;分“感知层、决策层、执行层”三个层级&#xff0c;其中感知层是最重要的一环…

Python数据分析:数据处理

数据处理是指对原始数据进行清洗、转换、整合和分析&#xff0c;以便从中提取有价值的信息。 常见的数据处理步骤包括&#xff1a; 数据清洗&#xff1a;去除缺失值、异常值和重复值。数据转换&#xff1a;对数据进行格式转换、归一化、标准化等操作。数据整合&#xff1a;将…

vue创建前端项目

背景 项目中需要用到前端技术&#xff0c;通过技术调研和团队分析&#xff0c;则采用vue作为前端主要技术栈。 问题 安装好后vue&#xff0c;按理说就可以创建vue项目 vue init webpack 项目名称 npm install&#xff0c;使用vue-cli脚手架搭建项目卡在sill idealTree buil…

C++高级编程——STL:list容器、set容器和map容器

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战…

C++入门【35-类访问修饰符】

数据封装是面向对象编程的一个重要特点&#xff0c;它防止函数直接访问类类型的内部成员。类成员的访问限制是通过在类主体内部对各个区域标记 public、private、protected 来指定的。关键字 public、private、protected 称为访问修饰符。 一个类可以有多个 public、protected…

C#hybridCLR热更新方案初探

前言 暂时处于初步研究状态&#xff0c;目前的框架使用还是尚少&#xff0c;本篇文章旨在同步给大家大概的使用流程和使用心得&#xff0c;在初步建立新项目时可以适当考虑。 介绍 热更新 与强制更新相对应&#xff0c;移动平台上App的可执行程序没有发生变化&#xff0c;仅…

[Go]认识Beego框架

对比Gin的简洁&#xff0c;自己之前基于Gin撸了一个架子&#xff0c;确实比beego目录看着舒服多了&#xff0c;不过最近接触到beego的项目&#xff0c;beego的bee工具使用还是很方便&#xff0c;来简单梳理下细节&#xff1b; Beego是一个开源的Go语言Web应用框架&#xff0c;…

边缘计算:在挑战与机遇的浪潮中破浪前行

在这个万物互联的时代&#xff0c;边缘计算如同一股清新奔腾的泉水&#xff0c;涌入了浩如烟海的技术海洋。它带着信息时代的涟漪&#xff0c;泛起了片片波澜&#xff0c;既有数据安全与隐私保护的风险&#xff0c;也有网络稳定性的挑战。但是&#xff0c;正如每一朵风雨都孕育…