Netty初体验,聊天室01

netty学习笔记-01 netty学习笔记 阅读详情
1、引入依赖
<dependencies>
    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>4.1.92.Final</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.22</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
    <dependency>
        <groupId>com.netty</groupId>
        <artifactId>chatroot-common</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.5</version>
    </dependency>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>19.0</version>
    </dependency>
    <dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java</artifactId>
        <version>3.11.3</version>
    </dependency>
</dependencies>

2、序列化

public interface Serializer {

    //反序列化方法
    <T> T deserialize(Class<T>clazz,byte[] bytes);
    //序列化方法
    <T> byte[] serialize(T object);

    enum Algorithm implements Serializer{

        Java {
            @Override
            public <T> T deserialize(Class<T> clazz, byte[] bytes) {
                try {
                    ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
                    return (T) ois.readObject();
                } catch (IOException | ClassNotFoundException e) {
                    throw new RuntimeException("反序列化失败", e);
                }
            }

            @Override
            public <T> byte[] serialize(T object) {
                try {
                    ByteArrayOutputStream bos = new ByteArrayOutputStream();
                    ObjectOutputStream oos = new ObjectOutputStream(bos);
                    oos.writeObject(object);
                    return bos.toByteArray();
                } catch (IOException e) {
                    throw new RuntimeException("序列化失败", e);
                }
            }
        },
        Json {
            @Override
            public <T> T deserialize(Class<T> clazz, byte[] bytes) {
                Gson gson = new GsonBuilder().registerTypeAdapter(Class.class,new Serializer.ClassCodec())
                        .create();
                String json = new String(bytes, StandardCharsets.UTF_8);
                return gson.fromJson(json,clazz);
            }

            @Override
            public <T> byte[] serialize(T object) {
                Gson gson = new GsonBuilder().registerTypeAdapter(Class.class, new Serializer.ClassCodec()).create();
                String json = gson.toJson(object);
                return json.getBytes(StandardCharsets.UTF_8);
            }
        },
    }
    class ClassCodec implements JsonSerializer<Class<?>>, JsonDeserializer<Class<?>>{

        @Override
        public Class<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            try {
                String str = json.getAsString();
                return Class.forName(str);
            }catch (ClassNotFoundException e){
                e.printStackTrace();
            }
            return null;
        }

        @Override
        public JsonElement serialize(Class<?> src, Type typeOfSrc, JsonSerializationContext context) {
            return new JsonPrimitive(src.getName());
        }
    }
}

3、实现序列化,并自定义协议

@ChannelHandler.Sharable
public class MessageCodecSharable extends MessageToMessageCodec<ByteBuf,Message> {
    @Override
    protected void encode(ChannelHandlerContext channelHandlerContext, Message message, List<Object> list) throws Exception {
        ByteBuf out = ByteBufAllocator.DEFAULT.buffer();
        // 校验数
        out.writeBytes(new byte[]{2,0,2,4});
        // 版本
        out.writeByte(1);
        // 序列化方式 0 jdk 1 json
        out.writeByte(Config.getSerializerAlgorithm().ordinal());
        // 指令类型  1字节
        out.writeByte(message.getMessageType());
        // 指令序号 4字节
        out.writeInt(message.getSequenceId());
        // 无意义填充 1字节
        out.writeByte(0xff);
        // 内容长度 1字节
        // 将内容转换为字节
        /*ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(message);
        byte[] bytes = bos.toByteArray();*/
        byte[] bytes = Config.getSerializerAlgorithm().serialize(message);
        out.writeInt(bytes.length);
        // 内容
        out.writeBytes(bytes);
        list.add(out);
    }

    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List<Object> out) throws Exception {
        int magicNum = in.readInt();
        int version = in.readByte();
        byte serializerAlgorithm = in.readByte();
        int messageType = in.readByte();
        int seqId = in.readInt();
        in.readByte();
        int length = in.readInt();
        byte[] bytes = new byte[length];
        in.readBytes(bytes, 0, length);
        /*ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
        Message message = (Message) ois.readObject();*/
        Serializer.Algorithm algorithm = Serializer.Algorithm.values()[serializerAlgorithm];
        // 确定具体消息类型
        Class<? extends Message> messageClass = Message.getMessageClass(messageType);
        Message message = algorithm.deserialize(messageClass, bytes);
        out.add(message);
    }
}

所有的准备工作已经完成,接下来编写业务代码

netty案例,netty4.1中级拓展篇十《Netty接收发送多种协议消息类型的通信处理方案》 前言介绍 在我们实际做应用级开发的过程中,客户端与服务端需要发送多种消息类型,比如一个聊天室场景包括的消息类型;登录验证、组建群聊、发送消息、退出登录等等,但如果我们都是用统一对象加if判断来分别转换,那么对后期的维护成本就会非常大,这样的代码方式也不是一个面向对象开发的思维。面向对象的开发思路,经常会把很多if、switch等逻辑抽象成对应的接口和抽象类,以及加入工厂方式对服务进行动态编排。 那... 阅读详情

相关推荐

【视频编码学习】AVS3参考软件HPM-4.1简单配置运行

1、用Visual Studio2017打开HPM-4.1文件夹 2、找到文件夹目录下x86_windows文件夹,因为是在win上运行该代码 3、然后找到对应vs版本(我当时2017版)的解决方案sln文件,双击打开可以看到该解决方案下的全部项目。 4、重新生成解决方案时发现提示sdk版本问题,所以右键点击所有的项目,选择重定向项目,修改一下sdk版本。 ...

谦虚勤奋诚实感恩 3100

netty源码构建找不到netty-tcnative包 --- Maven <classifier>元素

在构建netty的时候遇到一个问题,总是报netty-tcnative包找不到,这就奇了怪了,都是官方的源码,怎么会报错? 结果在maven本地库里面发现netty-tcnative包后面总是被加上了系统变量的名字,变成了netty-tcnative-1.1.32.Fork1_x86_64的字样。 结果问题就出在下面这个maven配置中: <dependency> <grou

hh544的专栏 2万+

STM32 Modbus-RTU从零到实战:手把手教你用HAL库实现工业通信(附完整代码)

本文详细介绍了如何使用STM32 HAL库从零开始实现Modbus-RTU从机通信。内容涵盖RS485硬件设计、CubeMX串口与定时器配置、基于空闲中断的高效数据接收、协议栈状态机设计、CRC16校验实现以及常用功能码处理。文章提供了完整的代码框架和调试方法,帮助开发者快速构建稳定的工业通信节点。

weixin_28278377的博客 191

RocketMQ——源码报错Missing artifact io.netty:netty-tcnative:jar:${os.detected.classifier}:1.1.33.Fork22

一.下载项目从官网下载下来的rocketmq-all-4.2.0(下载地址为:http://rocketmq.apache.org/release_notes/release-notes-4.2.0/)报错,项目结构如下二.Plugin execution not covered by lifecycle configuration错误具体报错内容:Plugin execution not cov...

东天里的冬天 8447

2025-08-19利用opencv检测图片中文字及图片的坐标

该代码实现了图片中中文文本的检测与位置计算功能。主要使用CnOcr库进行OCR识别,结合OpenCV和PIL库处理图像。功能包括:1)检测图片中的中文文本及位置坐标;2)计算每个文本的像素宽度和高度;3)在原图上绘制文本边界框并标注识别结果。代码通过put_chinese_text函数解决中文显示问题,最终输出各文本内容、坐标位置及尺寸信息。适用于需要获取图片中文字精确位置的应用场景。

m0_58149406的博客 396

SAP Workflow审批功能实例详细过程

SAP Workflow审批功能实例详细过程

陈送平的博客 6573

Netty高级进阶之基于Netty的Websocket开发网页聊天室

本通过实战演练,学习了如何基于Netty的websocket开发一个网页聊天室。 Netty高级进阶之基于Netty的Websocket开发网页聊天室 Webdocket简介 Websockt是一种在单个TCP连接上进行全双工通信的协议。 Websocket使客户端和服务端的数据交互变得简单,允许服务器主动向客户端推送数据。 在Websocket API中,客户端只需要与服务器完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。 他的应用场景如下: 社交订阅 协同编辑/编程 股票基金报价

远方的灯塔 1690

史上最小白之RNN详解

1.前言 网上目前已经有诸多优秀的RNN相关博客,但是我写博客的出发点主要是为了加深和巩固自己的理解,所以还是决定自己再进行一下总结和描述,如有不正确的地方欢迎指正~ 2.区分RNN 循环神经网络(Recurrent Neural Network),递归神经网络(Recursive Neural Network),你有没有发现他们的缩写都是RNN,那他们两个是同一回事儿吗?网上有一些博客把这两就当...

Tink1995的博客 4万+

Netty 入门学习教程之简易聊天室

Netty 入门学习教程之简易聊天室

极客星云-优快云博客 723

XLSX Workbench 在 ABAP 世界的定位与实战:从概念到完整示例

XLSX Workbench 在可视化、易维护与批量后台生成三方面填补了 ABAP 报表到 Excel 的空白。它与官方类及社区明星 abap2xlsx 形成了“模板驱动、代码驱动、二者兼顾”的互补格局。掌握 Workbench 后,开发者能把精力集中在业务逻辑以及数据质量,而把排版细节交给图形化工具,大幅加速交付与迭代。通过本文提供的示例,你可以立即在项目中落地并尝到效率提升的红利。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 525

MediaPipe 从入门到精通:安装、配置与多场景应用实战手册

人体姿态检测是 MediaPipe 的核心功能之一,它能够从图像或视频中识别人体姿态,并输出关键点的坐标。这些关键点覆盖了身体的主要部位,例如肩膀、肘部、髋部、膝盖等,总计 33 个点。每个关键点包含 x、y、z 坐标(归一化到 0-1 范围)以及可见性评分,可用于分析动作、姿势或开发健身、游戏等应用。手部关键点检测是 MediaPipe 的另一大亮点,它可以识别图像或视频中的手部,并输出 21 个关键点的坐标。这些关键点覆盖手掌和手指的各个部位,适用于手势识别、虚拟现实或交互式应用。

m0_71589036的博客 389

Netty 创建高性能聊天室 单聊 群聊 websocket

Netty 创建高性能聊天室 单聊 群聊 websocket

qq_50909707的博客 3494

史上最全工商银行核心系统建设历程:从“数据集中”到“ECOS”2.0,见证银行业信息科技跨时代发展征程

ECOS工程的直接成果是建成了工商银行第五代信息系统,即从单一核心银行系统到去核心化开放生态系统,率先开启了以智能化、开放化为特征,数据驱动引领经营模式变革,创新提出了一整套国际领先的分布式开放生态银行系统建设方案,在大型银行全分布式系统架构、主机下移、银行系统生态化转型、大规模交易型分布式数据库等多个领域再次实现“0到1”的突破,建成了具备国际领先水平的全分布式开放生态银行系统,继续勇立数字化转型潮头,推动高质量发展再上新台阶。工商银行的业务连续性管理水平实现了跨越式发展,有力地保障了业务发展。

银行信息系统应用架构详解 827

Netty之旅二:口口相传的高性能Netty到底是什么?

高清思维导图原件(xmind/pdf/jpg)可以关注公众号:一枝花算不算浪漫 回复netty01即可。 前言 上一篇文章讲了NIO相关的知识点,相比于传统IO,NIO已经做得很优雅了,为什么我们还要使用Netty? 上篇文章最后留了很多坑,讲了NIO使用的弊端,也是为了引出Netty而设立的,这篇文章我们就来好好揭开Netty的神秘面纱。 本篇文章的目的很简单,希望看过后你能看懂Netty的示例代码,针对于简单的网络通信,自己也能用Netty手写一个开发应用出来! 一个简单的Netty示例 以下是一个简.

一枝花算不算浪漫的专栏 447

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

java框架Netty网络编程——问鼎篇

Netty进阶 粘包现象 案例 服务端代码 public static void main(String[] args) { NioEventLoopGroup bossGroup=new NioEventLoopGroup(1); NioEventLoopGroup workerGroup=new NioEventLoopGroup(2); try { ServerBootstrap serverBootstrap = new ServerBootstrap();

卷心菜是俺的博客 793

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Netty学习指南(资料、文章汇总)

文章目录学习资料文章汇总 学习资料 学习前具备知识:Java基础IO、多线程、部分jvm知识… Netty官网 原理知识点: TCP的粘包与粘包(网络):面试题:粘包和拆包、tcp粘包和拆包的处理方案 简述同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别 文章推荐: netty全过程图解(最详细清晰版) 视频: 中文字幕版-Netty One Framework to rule them all by Norman Maurer:1小时,项目leader讲解Netty4 黑马程序员Net

每个人都是独一无二的,把握好自己的节奏,跟着自己的心走。 2410

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

spring boot+mvc+mybatis+netty-sokey.io+html+js实现简单即时通讯聊天系统

项目采用基于jdk1.8整合springboot+springmvc+netty-sockeyio实现简单的一对一聊天和聊天室多人聊天的web即时通讯系统.

蔡泽华的专栏 4539

01-netty、redis、zookeeper基本介绍

1.netty 简介 基于NIO的客户端/服务器编程框架,它既能快速开发高并发、高可用、高可靠性的网络服务器程序,也能开发高可用、高可靠的客户端程序。 Netty是互联网中间件领域使用最广泛、最核心的网络通信框架之一。 NOI是指非阻塞输入输出(Non-Blocking IO),也称非阻塞IO。 2.redis 简介 Redis的主要应用场景:缓存(数据查询、短连接、新闻内容、商品内容等)、分布式会话(Session)、聊天室的在线好友列表、任务队列(秒杀、抢购、12306等)、应用排行榜、访问统计、数

林帆的博客 372

netty-socketio

一、简介   netty-socketio是一个开源的Socket.io服务器端的一个java的实现,它基于Netty框架。项目地址为:https://github.com/mrniko/netty-socketio 。socket.io是一个跨浏览器使用websocket为实时实时应用提供服务。本例子使用maven构建,依赖如下: &lt;dependency&gt; &lt;...

weixin_34149796的博客 445

2019最新Netty5快速入门及实例教程(实战+源码+笔记)

Netty5快速入门及实例视频教程(视频+源码+笔记) 课程目录: 01、第一课NIO 1、传统的socket分析 2、NIO的代码分析 3、网上对于NIO的一些疑惑 02、第二课netty服务端 1、netty服务端helloWorld入门~1 2、netty服务端入门补充~1 03、第三课netty客户端 1、Netty客户端入门~1 04、第四课netty线...

keke1121的博客 561

Netty的介绍与使用--第一天(NIO中Channel的介绍与简单的使用)

Netty的介绍与使用--第一天Netty介绍通道(Channel) Netty介绍 Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 Netty 是一个广泛使用的 Java 网络编程框架(Netty 在 2011 年获得了Duke’s Choice Award,见https://www.java.net/dukeschoice/2011)。它活跃和成长于用户社区,像大型公司 Facebook 和 Instagram 以及流行 开源项

weixin_37541878的博客 826

SpringBoot整合Netty构建高性能WebSocket服务:架构设计与压测实战

WebSocket作为一种全双工通信协议,是实现服务端主动推送和低延迟实时交互的核心技术。其工作原理基于HTTP协议升级握手,建立持久连接后进行二进制帧通信,有效解决了传统HTTP轮询带来的高延迟与资源浪费问题。在需要高并发、低延迟的实时应用场景中,如在线协作、金融行情推送和大规模聊天室,WebSocket的技术价值尤为凸显。为了应对海量连接与高吞吐量的挑战,Netty凭借其事件驱动、异步非阻塞的NIO架构,成为构建高性能网络服务的首选框架。通过将SpringBoot的便捷开发与Netty的网络性能优势相结

weixin_34297704的博客 376

最新Netty5快速入门及实例(视频+源码+笔记)

Netty5快速入门及实例视频教程(视频+源码+笔记) 课程目录: 01、第一课NIO 1、传统的socket分析 2、NIO的代码分析 3、网上对于NIO的一些疑惑 02、第二课netty服务端 1、netty服务端helloWorld入门~1 2、netty服务端入门补充~1 03、第三课netty客户端 1、Netty客户端入门~1 04、第四课netty线...

qq_43713423的博客 1211

Netty实战应用学习笔记-中级拓展篇(十)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 40

go java websocket_golang websocket的例子

最近写了一个chrome的websocket extension, server端用的是Java的Netty框架, 后来发现golang 实现websocket 非常简单,高效, 下面是例子, 简单实现了用户登录,广播,相当于聊天室!package mainimport ("code.google.com/p/go.net/websocket""html/template""log""net/ht...

weixin_31630721的博客 216
下一篇: Netty初体验,聊天室02
工作这么多年,学会了内卷
博客等级 码龄7年 156粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

工作这么多年,学会了内卷

共同加油,继续努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值