使用Netty实现聊天室

news/2024/5/17 18:00:14 标签: netty, tcp

文章目录

    • 二、Netty实现聊天室

二、Netty实现聊天室

项目相关代码已上传至github:https://github.com/2NaCl/netty-Chatting

项目的中心是实现一对多的聊天平台,首先我们要整理思路,这个平台的代码实现,肯定也是一个启动类的服务器,一个能启动多次的client。

先说服务器的思路:

  1. 创建事件循环组,绑定端口
  2. 创建初始化程序,进行channel的过滤操作
  3. 过滤的同时写一个Handler,能够让Client实现一对多。

启动程序和过滤channel的操作,和之前的是一样的,可以参考上一篇博客的详解,这里就不过多累述了,代码也在github。

文章链接:https://blog.csdn.net/qq_41936805/article/details/100557748

在这里主要说一下ServerHandler的实现

在这里插入图片描述
也是继承这个类,但是我们可以继承这个,也可以继承ChannelInboundHandler,这是一个简单的适配器模式,如果不知道什么是适配器模式的话,可以参考这篇文章https://blog.csdn.net/qq_41936805/article/details/100620303

  1. 首先也是先搭好大体的框架,一个具体的Handler,和一个错误打印和服务器关闭。

在这里插入图片描述

接下来我们要实现的是,一个Client的上线会通知给其他Client,并且消息会进行广播。

  1. 因为会有很多client都注册进来,所以就会产生很多channel,我们要进行广播的话,就要把channel放进一个组里,也是借用netty的一个实现。

在这里插入图片描述
下面依次介绍我们要实现的功能:

  1. 首先client连接到server,连通之后,立刻触发回调函数,表示服务器正常

在这里插入图片描述

  1. 若连接失败,Server端出现了问题的话,触发回调函数

在这里插入图片描述

  1. 若有人上线,立即触发回调函数

在这里插入图片描述

  1. 有人下线

在这里插入图片描述

  1. 当客户端有信息经由服务端去转发的时候,我们要保证,这个信息可以广播到所有其他的ip,除了自己的,那么就需要对channels进行遍历,然后进行一下筛选,再处理。

在这里插入图片描述
实现了服务端之后,下面就要开始写客户端了,客户端相对于服务端已经简单了很多。

  1. Client的启动类和初始化也都是和之前一样的,我们只需要完善一下读取控制台输入的信息,然后放进channel组里面去写出就行了

在这里插入图片描述

然后一个基于TCP的netty实现的聊天室就ok了,代码已经上传到github,可以看最上面的地址。

但是还有一个缺陷:如果客户端异常退出,而不是正常点击下线的话,无法触发handlerRemoved操作,所以我们需要手写一个类似于zk的心跳包去send each other来确定是否还在线。

这个操作需要在Server Handler上去改正:

  1. 首先我们新添一个过滤器,将被判定为离线的人的消息进行过滤。
    在这里插入图片描述

  2. 重写一个回调方法,定义一下,当一个事件触发以上三种超时之后,我们的措施是什么

在这里插入图片描述


http://www.niftyadmin.cn/n/784500.html

相关文章

基于unity3d的RRT算法路径规划

转载于:https://www.cnblogs.com/herd/p/9034342.html

DLL中创建窗口

char szClassName[] "MainWClass"; WNDCLASSEX wndclass; // 用描述主窗口的参数填充WNDCLASSEX结构 wndclass.cbSize sizeof(wndclass); wndclass.style CS_HREDRAW|CS_VREDRAW; wndclass.lpfnWndProc WindowProc; wndclass.cbClsExtra 0; wndclass.cbWnd…

SPRING-BOOT系列之SpringBoot的诞生及其和微服务的关系

转载自 : https://www.cnblogs.com/ityouknow/p/9034377.html 微服务架构 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物。互联网时代的产品通常有两类特点&…

结构型——桥接模式(Bridge Patterns)总结

桥接模式的核心是:将抽象与实现分离开来,使他们可以独立变化。 实现模式: 主要解决: 在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。 何时使用: 实现系统可能有多个角…

labview 8.5 安装和破解步骤

labview 8.5 安装和破解步骤 [转载]1,运行labview_85_ch.exe文件,进行自解压和安装,在解压由用户确定解压后的暂存文件存放目录,不是安装的目标文件路径; 2,在安装过程中会要求你选择是安装试行版本还是正式…

数据结构20:KMP算法(快速模式匹配算法)详解

通过上一节的介绍,学习了串的普通模式匹配算法,大体思路是:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j1 的回退操作(这个过程称为“指针回溯”)&am…

Groza项目技术文档

文章目录一、概述二、Module ReferenceAnnotation APIReference项目代码来源于github,觉得和自己专业很贴近,就clone下来去分析了一下,源代码地址是https://github.com/sanshengshui/Groza 一、概述 首先说一下大体架构。 ModulePositionRe…

VB之道

VB之道: 内篇 一、 大师为一帮初学者讲解VB之道。 初学者问道:VB很容易学习吗? 大师答道:是的。 初学者问道:VB的结构很简单吗? …