专栏首页Hcode网站Netty+Swing实现在线聊天室

Netty+Swing实现在线聊天室

前言

在线聊天室2.0版本 在之前的博文的基础上,更换BIO的socket通信为NIO的Netty框架,添加新功能,整合管理端和用户端。

基本功能

  • 相较与前一版:
  • 添加启动时连接失败,进行有限次重连的操作。(客户端)
  • 还有监控连接是否异常中断,进行有限次断线重连操作。(客户端)
  • 服务端对客户端进行的心跳检测机制。(服务端与客户端)
  • 再则把管理端和服务端的的界面分离出来,使用策略模式,统一一个登录界面,根据是否成功输入管理员秘钥(默认为“HCODE”),负责生成不同的客户端界面(分为管理员和普通用户)。
  • 继承前一版:
  • 管理端 1)管理员设置聊天室IP,端口号,管理员昵称,连接服务器进入聊天室或退出聊天室。 2)系统消息日志记录,管理员可发布系统消息给各在线用户。 3)管理员在线与聊天室在线用户进行群聊。 4)管理员可对在线用户列表中指定用户进行私聊请求,对方同意即可开始私聊。 5)管理员可对在线用户列表中指定用户进行踢出聊天室操作,并通知其他人。
  • 普通用户端 1)用户设置聊天室IP,端口号,用户昵称,连接服务器进入聊天室或退出聊天室。 2)系统消息通知,接受服务器端发布的消息,以及用户一些操作。 3)用户可与其他在线用户进行群聊。 4)用户可与指定用户列表中其他在线用户进行私聊请求,同意即可开始私聊。 5)用户可以屏蔽指定用户列表中的用户的群聊发言,屏蔽后即接受不到对方发言, 同时也可以选择取消屏蔽。

传输的协议说明

COPYpublic class MsgModel implements Serializable {
    private byte type; // 权限信息标志
    private byte code; // 命令符
    private String body; // 消息主体
}

- type: 权限信息标志 (参数含义) 1. 管理员特权消息 2. 用户或管理员消息 3. 系统消息(客户端处理)

  • code: 命令符(参数含义)
    • 0.上线消息 1. 群聊 2. 私聊 3. 屏蔽某人 4. 取消屏蔽 5. 踢出某人
    • 6.系统通知 7. 管理员发布通知 8. 心跳检测 9. 发送在线用户列表给客户端
      1. 新用户加入 11. 用户退出 110. 权限认证
  • body:具体消息主体(code参数与之对应的格式)
COPY 1.群聊的body格式
 客户端发送: <id>${socketChannel.id}</id><msg>${msg}</msg>
 服务端发送: <id>${socketChannel.id}</id><name>${name}</name><msg>${msg}</msg><time>${time}</time>

 2.私聊的body格式为
 客户端发送:<id>${socketChannel.id}</id><order>{orderNum}</order><msg>${msg}</msg>

 当order为1,msg为start 
 当order为1,msg为exit

 服务端发送:<id>${socketChannel.id}</id><order>${orderNum}</order><msg>${msg}</msg><time>${time}</time>
 orderNum---> 1.发起私聊  2.结束私聊 3.普通私聊信息 4.对方已离线,关闭私聊窗口

 3 4.屏蔽或取消屏蔽的body格式为
 客户端发送:<me>${myId}</me><other>${shieldId}</other>

 5.管理员踢人指令body格式:
  客户端发送:发生所选用户的id
  服务端发送:<admin>${socketChannel.id}</admin><kick>${beKick.id}</kick><time>${time}</time>

 6.系统通知消息的body格式为:
  <msg>${msg}</msg><time>${time}</time>

 7.管理员发布系统消息body格式:
  <id>${socketChannel.id}</id><msg>${msg}</msg><time>${time}</time>

 8.心跳事件body格式:
  客户端发送:"a ‘ping’ beat heart from"+ctx.channel().remoteAddress() //后面为该用户端所在的ip和端口号
  服务端:只进行心跳检测,客户端在心跳检测事件内有发送信息让服务端读到,则说明该用户还存活,否则关闭通道。

 9.用户列表 由服务器端查询在线用户发送给新加入的用户 
  body格式为:
  <user><id>${socketChannel.id}</id><name>${name}</name><authority>${admin or user}</authority></user>
  注:每个用户的信息都如上,然后列表有多个用户信息拼接而成。

 10 11.用户进入与退出的消息body格式:
 <id>${socketChannel.id}</id><name>${name}</name><authority>${authority}</authority><time>${time}</time>

 110.权限认证消息的body格式:
 客户端发送:管理员认证密钥HCODE即可行驶管理员权力。

界面演示

  • 可选以普通用户或者管理员身份登录,管理员权限密令默认为:HCODE
  • 普通用户
  • 管理员
  • 私聊窗口
  • 启动时连接失败,进行有限次重连
  • 断线重连

项目GitHub地址

https://github.com/HimitZH/Netty-ChatRoom

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SSM框架(六)Mybatis实现一对多和多对一查询

    HcodeBlogger
  • Hcode网站的搭建日记(四)Ajax实现阅读量统计

    在静态网页可以不刷新重载网页实现以下功能,特别是有设置缓存的静态网站,可以动态执行所需要的更新,避免一些不必要资源的再次加载,可以增加浏览器的访问速度,增加客户...

    HcodeBlogger
  • Java中的IO流(一)字节流的常用操作

    今天带来的是JAVA的IO流中的字节流,InputStream和OutputStram子类流的用法。

    HcodeBlogger
  • mybatis异常 :元素内容必须由格式正确的字符数据或标记组成。

    今天同事写一个查询接口的时候,出错:元素内容必须由格式正确的字符数据或标记组成。 错误原因:mybatis查询的时候,需要用到运算符 小于号:< 和  大于号:...

    庞小明
  • Python装饰器详解

    装饰器本质就是函数,作用是装饰其它函数,给其它函数增加附加功能,提高代码复用,减少代码量。

    橙子探索测试
  • 关于经典停车场问题指针输出乱码问题?

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> struct ...

    互联网CEO
  • 【未完成】7-13 最短工期 (25 分)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    韩旭051
  • 利用装饰器计算函数运行的时间

    西西嘛呦
  • 30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用

    2016年时,Jerry曾经写过一系列关于SAP Fiori Smart Template(现在更名为Fiori Elements了)的博客,介绍了所谓的MDD...

    Jerry Wang
  • MySQL: datetime vs timestamp

    表person的create_time字段是datetime类型,modify_time是timestamp类型

    十毛

扫码关注云+社区

领取腾讯云代金券