Netty初体验,聊天室02

Netty :Netty介绍 & 实现简易多人聊天室 Netty :Netty介绍 & 实现简易多人聊天室 博主在去年二月份就介绍了Java原生网络编程API,并用它们实现了多种I/O模型的简易多人聊天室: Java网络编程-Socket编程初涉一(简易客户端-服务器) Java网络编程-Socket编程初涉二(基于BIO模型的简易多人聊天室) Java网络编程-Socket编程初涉三(伪异步I/O模型的简易多人聊天室) Java网络编程-Socket编程初涉四(NIO模型的简易多人聊天室) Java网络编程-Socket编程初涉五 阅读详情

1、客户端与服务端进行数据传输的协议

  抽象的消息类实现序列化

 PS:本博主不会描述,逼急眼了只会上代码。

@Data
public abstract class Message implements Serializable {

    /**
     * 根据消息类型获取对应的class
     * @param messageType
     * @return
     */
    public static Class<? extends Message> getMessageClass(int messageType){
        return map.get(messageType);
    }

    private int sequenceId;

    private int messageType;

    public abstract int getMessageType();

    public static final int LoginRequestMessage = 0;
    public static final int LoginResponseMessage = 1;
    public static final int ChatRequestMessage = 2;
    public static final int ChatResponseMessage = 3;
    public static final int GroupCreateRequestMessage = 4;
    public static final int GroupCreateResponseMessage = 5;
    public static final int GroupJoinRequestMessage = 6;
    public static final int GroupJoinResponseMessage = 7;
    public static final int GroupQuitRequestMessage = 8;
    public static final int GroupQuitResponseMessage = 9;
    public static final int GroupChatRequestMessage = 10;
    public static final int GroupChatResponseMessage = 11;
    public static final int GroupMemberRequestMessage = 12;
    public static final int GroupMemberResponseMessage = 13;
    public static final int PingMessage = 14;
    public static final int PongMessage = 15;
    /**
     * 请求类型 byte 值
     */
    public static final int RPC_MESSAGE_TYPE_REQUEST = 101;
    /**
     * 响应类型byte值
     */
    public static final int RPC_MESSAGE_TYPE_RESPONSE = 102;

    private static final Map<Integer,Class<? extends Message>> map = new HashMap<>();

    static {
        map.put(0, com.chatroomserver.message.ChatRequestMessage.class);
        map.put(1,LoginResponse.class);
    }

}

响应抽象类

public abstract class AbstractResponseMessage extends Message{

    private boolean success;

    private String reason;

    public AbstractResponseMessage() {
    }

    public AbstractResponseMessage(boolean success, String reason) {
        this.success = success;
        this.reason = reason;
    }

    public boolean isSuccess(){
        //System.out.println(this.success);
        return this.success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }
}

在具体业务中,请求类与相应类一一对应,并由特定Handler接收

LogingRequestMessage--- LoginResponseMessage

ChatRequestMessage --- ChatResponseMessage

GroupChatRequestMessage --- GroupChatResponseMessage

直接上代码

@Data
@ToString(callSuper = true)
public class LoginRequestMessage extends Message{

    private String username;
    private String password;

    public LoginRequestMessage() {
    }

    public LoginRequestMessage(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @Override
    public int getMessageType() {
        return LoginRequestMessage;
    }
}
@Data
@ToString(callSuper = true)
public class LoginResponse extends AbstractResponseMessage{

    private String from;
    private String content;

    public LoginResponse(boolean success, String reason) {
        super(success, reason);
    }

    public LoginResponse(String from, String content) {
        this.from = from;
        this.content = content;
    }

    @Override
    public int getMessageType() {
        return LoginResponseMessage;
    }
}
@Data
@ToString(callSuper = true)
public class ChatRequestMessage extends Message{
    private String content;
    private String to;
    private String from;
    @Override
    public int getMessageType() {
        return LoginRequestMessage;
    }

    public ChatRequestMessage(String content, String to, String from) {
        this.content = content;
        this.to = to;
        this.from = from;
    }

}
@Data
@ToString(callSuper = true)
public class ChatResponseMessage extends AbstractResponseMessage{

    private String from;

    private String context;

    public ChatResponseMessage(boolean success, String reason) {
        super(success, reason);
    }

    @Override
    public int getMessageType() {
        return ChatResponseMessage;
    }

    public ChatResponseMessage(String from, String context) {
        this.from = from;
        this.context = context;
    }
}
@Data
@ToString(callSuper = true)
public class GroupChatRequestMessage extends Message{

    private String from;
    private String groupName;
    private String context;

    public GroupChatRequestMessage(String from, String groupName, String context) {
        this.from = from;
        this.groupName = groupName;
        this.context = context;
    }

    @Override
    public int getMessageType() {
        return GroupChatRequestMessage;
    }
}
@Data
@ToString(callSuper = true)
public class GroupChatResponseMessage extends AbstractResponseMessage{

    private String from;
    private String content;

    @Override
    public int getMessageType() {
        return GroupChatResponseMessage;
    }

    public GroupChatResponseMessage(boolean success, String reason) {
        super(success, reason);
    }

    public GroupChatResponseMessage(String from, String content) {
        this.from = from;
        this.content = content;
    }
}
@Data
@ToString(callSuper = true)
public class GroupCreateRequestMessage extends Message{

    private String from;
    private String groupName;
    private Set<String> members;

    public GroupCreateRequestMessage(String from, String groupName, Set<String> members) {
        this.from = from;
        this.groupName = groupName;
        this.members = members;
    }

    @Override
    public int getMessageType() {
        return GroupChatRequestMessage;
    }
}
@Data
@ChannelHandler.Sharable
public class GroupCreateResponseMessage extends AbstractResponseMessage{

    private String from;
    private String content;

    public GroupCreateResponseMessage(String from, String content) {
        this.setSuccess(true);
        this.from = from;
        this.content = content;
    }

    public GroupCreateResponseMessage(boolean success, String reason) {
        super(success, reason);
    }

    @Override
    public int getMessageType() {
        return GroupCreateResponseMessage;
    }
}
@Data
@ToString(callSuper = true)
public class PingMessage extends Message{

    private Integer code;

    private String message;

    public PingMessage(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    @Override
    public int getMessageType() {
        return PingMessage;
    }
}
public class PongMessage extends AbstractResponseMessage{

    public PongMessage(boolean success, String reason) {
        super(success, reason);
    }

    @Override
    public int getMessageType() {
        return PongMessage;
    }
}

以上代码为消息传输中所能用到的消息类型

JAVA Netty实现聊天室+私聊功能 功能介绍 使用Netty框架实现聊天室功能,服务器可监控客户端上下限状态,消息转发。同时实现了点对点私聊功能。技术点我都在代码中做了备注,这里不再重复写了。希望能给想学习netty的同学一点参考。 服务器代码 服务器入口代码 package nio.test.netty.groupChat; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.Ch 阅读详情

相关推荐

Netty实现简易聊天室的功能

使用Netty来实现一个聊天室是很容易的,当有客户端连接服务端的时候,在服务端的channelActive方法里面即可感应到。这里的解决方案是发送每条数据的时候,将数据的长度一并发送,比如可以选择每条数据的前4位是数据的长度,应用层处理时可以根据长度来判断每条数据的开始和结束。同理,channelInactive是该客户端断开服务端时会回调的方法,在里面给其他客户端发一条“下线了”的信息即可。如果数据长度不够length,就等待下一次数据过来,取数据的时候也只取length长度的数据。

天瑕的博客 2665

Netty优化与源码

优化与源码分析 1. 优化 1.1 扩展序列化算法 序列化,反序列化主要用在消息正文的转换上 序列化时,需要将 Java 对象变为要传输的数据(可以是 byte[],或 json 等,最终都需要变成 byte[]) 反序列化时,需要将传入的正文数据还原成 Java 对象,便于处理 目前的代码仅支持 Java 自带的序列化,反序列化机制,核心代码如下 // 反序列化 byte[] body =...

却叶落飘零 956

Netty网络编程实战2,使用Netty开发聊天室功能

Java高并发编程实战系列,打造精品专栏。

学Java,找哪吒 4719

【NIO与Netty】Netty优化与源码

黑马程序员 Netty优化与源码:扩展序列化算法,参数调优,模拟RPC框架,源码分析(服务器启动跟踪,nioeventloop 剖析,accept、read 事件跟踪)

知识输出、记录学习 580

微调BERT进行中文文本分类任务(Pytorch代码实现)

BERT(Bidirectional Encoder Representation from Transformers)是2018年10月由Google AI研究院提出的一种预训练模型。其模型结构由多层Transformer的Encoder堆叠而成,在大规模语料中进行预训练后,迁移到下游任务,仅进行参数微调训练,就能显著提升性能。本文聚焦于微调中文BERT进行新闻标题分类任务的代码实现。

Iswayzw的博客 1万+

地瓜机器人RDK Studio使用入门教程

不知道大家在使用AI开发板的时候有没有遇到过板子官方镜像占据空间大难以保存,想要的时候找不到?官方示例项目久而久之便难以找寻?首次登陆开发板连接网络还需要准备显示器键盘鼠标外设繁杂?…为了解决平时开发过程中遇到的种种不便利问题,地瓜机器人创新的推出了RDK Studio这一官方开发者软件,使智能机器人开发迎来新纪元!通过这一软件极大降低了机器人的开发门槛,哪怕是零基础的用户亦可轻松上手RDK系列板卡!

xiongqi123123的博客 3431

基于netty的多人多聊天室

上篇文章已经详细介绍了如何基于netty搭建一个多人单聊天室(https://blog.youkuaiyun.com/baidu_37147070/article/details/99131686),那么怎么建一个多人多聊天室呢? 其实,实现的方法并不难,我是借助使用redis来实现的,我们从代码中可以知道,对于每个聊天的channel,是通过ChannelGroup来管理的,也就是每个进来的通道,...

向日葵班学霸的博客 1890

基于STM32的电子琴音乐播放器设计

​ 本设计以实际电路为最后的结果,实现了所有与其功能,具有重要的现实意义。件,在Proteus中进行原理图绘制,然后把 .hex文件下载到STM32F103RBT6中 进行仿真。由于网络上 下载的 Proteus中 没有 STM32F103RBT6这个芯片型号,我们又从网上 下载芯片 进行仿真。​ 本设计以实际电路为最后的结果,实现了所有与其功能,具有重要的现实意义。

TMMXA的博客 2万+

基于netty NIO开发的聊天室

一、为何要使用netty开发 由于之前已经用Java中的socket写过一版简单的聊天室,这里就不再对聊天室的具体架构进行细致的介绍了,主要关注于使用netty框架重构后带来的改变。对聊天室不了解的同学可以先看下我的博客(《JAVA简单聊天室的实现》) 本篇博客所使用的netty版本为4.1.36,完整工程已上传到Github(https://github.com/Alexlingl/Chat...

Alexwym的博客 3556

datax web升级springboot3 jdk17

datax web但GitHub上还是springboot2,没有升级过,最近扫漏洞发现spring-core漏洞必须升级到6.x才能解决,这时不得不将springboot升级到3.x,随之而来是jdk、mybatis-plus等等的升级,调整了几天才没问题,痛苦的开发人生~~以上,有疑问欢迎留言。

liyinglong1023的博客 975

【自动驾驶端到端5:VADv2: End-to-End Vectorized Autonomous Driving via Probabilistic Planning】

从大规模人类驾驶演示中学习类人驾驶策略是有希望的。但是,规划的不确定性使得从驾驶演示中提取驾驶知识是有挑战性的。从统计学习的角度来看,动作(包括实际和速度)是高度随机的,受许多无法建模的潜在因素影响。

weixin_40000560的博客 1405

Netty Websocket多人多房间聊天室Demo

Netty Websocket多人多房间聊天室Demo 描述:可任意输入自己的昵称和要加入的聊天室名,即可加入聊天室进行聊天,在同一个聊天室内的所有人的发言每个人都会立即收到 项目使用springboot,源码https://gitee.com/HumorChen/netty_websocket_chatroom_demo 主要是这么些步骤: 建立两个事件轮询组NioEventLoopGroup,一个用来处理连接的建立,一个用来处理消息的处理 建立一个启动器ServerBootstrap,方便我们启动

HumorChen的博客 2662

Deep Reinforcement Learning - 1. DDPG原理和算法

Deep Reinforcement Learning - 1. DDPG原理和算法 背景描述 DDPG的定义和应用场景 DDPG算法相关基本概念定义 DDPG实现框架和算法 DDPG对于DPG的关键改进 下一篇 以下用RL作为Reinforcement Learning 的简称。背景描述概括来说,RL要解决的问

kenneth_yu的博客 14万+

java netty聊天室_基于netty搭建一个聊天室

前言上篇博文(netty实现消息中心(一)思路整理)大概说了下netty websocket消息中心的设计思路,这篇文章主要说说简化版的netty聊天室代码实现,支持群聊和点对点聊天。此demo主要说明netty实现消息推送的基本使用方法,如果需要扩充其它功能,可以基于此脚手架扩展。完整项目代码地址:netty聊天室github源码介绍1.登录页面login.png2.聊天页面index.png核...

weixin_32520565的博客 902

看完这篇爽文我终于学会了示波器(一)

示波器基础篇的介绍,希望对你有用,下次分享一下如何测试。

qq_45508321的博客 974

[ATF]-smc指令详解

1、在ree/tee调用smc之前 2、调用smc之后,cpu触发同步异常,进入ATF的sync_exception_aarch64—>handle_sync_exception—>smc_handler64处理函数 在smc_handler64中又调用了smc_handler func smc_handler64 /* ---------------------------------------------- * Detect if this is a RUN_IMAGE or ot

baron-周贺贺-代码改变世界ctw 1万+

基于Netty的聊天室实现

channelHandlerContext.writeAndFlush(new GroupJoinResponseMessage(true, groupJoinRequestMessage.getGroupName() + "聊天室加入成功"));channelHandlerContext.writeAndFlush(new GroupJoinResponseMessage(true, groupJoinRequestMessage.getGroupName() + "聊天室不存在"));

m0_61138839的博客 1516

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

netty系列之:文本聊天室

经过之前的系列文章,我们已经知道了netty的运行原理,还介绍了基本的netty服务搭建流程和消息处理器的写法。今天本文会给大家介绍一个更加复杂的例子,文本聊天室。

程序那些事 7430

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Netty实现聊天室

文章目录 本文内容基于上一篇博客 netty实现WebSocket协议,一些基本使用请参考该博客。 本例实现的功能: 有新成员加入时,群广播消息,欢迎加入 有成员退出时,群广播消息,退出 每个成员都可以发送消息,消息广播给群内的每个人 完整的服务器代码如下: package com.example; import com.alibaba.fastjson.JSONObject; import...

刘本龙的专栏 2073

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

基于Netty的WebSocket聊天室Demo

这个项目基于Netty 4.1.x、Spring Boot、Spring WebFlux,构建了一个基于WebSocket协议的多人聊天室Demo。这个项目能够帮助我们快速学习、了解Netty和WebSocket。

Spencercjh 929

Netty搭建简易聊天室

NIO框架Netty搭建简易聊天室 Netty Reactor模型 单线程模型 用户发起 IO 请求到 Reactor 线程 Ractor 线程将用户的 IO 请求放入到通道,然后再进行后续处理 处理完成后,Reactor 线程重新获得控制权,继续其他客户端的处理 缺点: 这种模型一个时间点只有一个任务在执行,这个任务执行完了,再去执行下一个任务。 但单线程的 Reactor 模型每一个用户事...

jl935418600的博客 1393

【实战】基于Netty实现WebSocket聊天室

目录1.目的2.Netty是什么2.1.Netty和Tomcat的区别2.2.Netty为什么流行2.2.1并发高2.2.2.传输快2.2.3.封装好基于Netty实现WebSocket聊天室创建simple_webchat项目编写代码结果 1.目的 学习和了解Netty的应用场景和使用方式 2.Netty是什么 Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 2.1.Netty和Tomcat的区别 Netty和Tomca

weixin_40460171的博客 792

Netty 群聊私聊聊天室

Netty实现简易聊天室 文章目录Netty实现简易聊天室1.协议定制1.1协议格式:1.2编解码器:2.黏包半包问题3.封装消息3.1Message3.2AbstractResponseMessage3.3其他消息4.处理连接断开5.实现会话6.具体业务的实现6.1单对单聊天6.2客户端退出7.假死与心跳8.核心代码 在Netty 的学习结束之后就很想去实现一个简单的聊天室,在参考黑马视频之外,添加自己的理解和处理实现了一个建议的聊天室,本聊天室将实现简单的几个技术需求: 定制协议 协议格式定制 协

Jeffrey_oWang的博客 1056

Netty网络聊天室之基础网关搭建

最近在学习Netty框架,使用的学习教材是李林锋著的《Netty权威指南》。国内关于netty的书籍几乎没有,这本书算是比较好的入门资源了。我始终觉得,学习一个新的框架,除了研究框架的源代码之外,还应该使用该框架开发一个实际的小应用。为此,我选择Netty作为通信框架,开发一个模仿QQ的聊天室。基本框架是这样设计的,使用Netty作为通信网关,使用JavaFX开发客户端界面,使用Spring作为I...

littleschemer的博客 1万+

netty+vue实现聊天室

HttpRequestHandler package org.lmj.chatroom; import io.netty.channel.*; import io.netty.handler.codec.http.*; import io.netty.handler.ssl.SslHandler; import io.netty.handler.stream.ChunkedNioFile; i...

远行的博客 2445

Netty版-简易聊天室

通过Netty实现简易聊天室

namelessmyth的专栏 1448
上一篇: Netty初体验,聊天室01
下一篇: Netty初体验,聊天室03(项目核心)
工作这么多年,学会了内卷
博客等级 码龄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、付费专栏及课程。

余额充值