计算机编程的学习,能不能把知识学到手,讲究的是动手实践。在我编写的文章中,基本都是以实践代码验证结果为核心来讲述文章内容。

可能有人不知道 Netty 是什么,这里简单介绍下:

Netty 是一个 Java 开源框架。Netty 提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。

也就是说,Netty 是一个基于 NIO 的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。

Netty 相当简化和流线化了网络应用的编程开发过程,例如,TCP 和 UDP 的 Socket 服务开发。

这套 IM 代码分为了三组模块:UI、客户端、服务端。

之所以这样拆分,是为了将UI展示与业务逻辑隔离,使用事件和接口进行驱动,让代码层次更加干净整洁易于扩展和维护。

系统设计

在这套IM中,服务端采用DDD领域驱动设计模式进行搭建。将 Netty 的功能交给 SpringBoot 进行启停控制,同时在服务端搭建控制台可以非常方便的操作通信系统,进行用户和通信管理。在客户端的建设上采用UI分离的方式进行搭建,以保证业务代码与UI展示分离,做到非常易于扩展的控制。

另外,在功能实现上包括:完美仿照微信桌面版客户端、登录、搜索添加好友、用户通信、群组通信、表情发送等核心功能。如果有对于实际需要使用的功能,可以按照这套系统框架进行扩展。

解释一下:

1)UI开发:使用JavaFx与Maven搭建UI桌面工程,逐步讲解登录框体、聊天框体、对话框、好友栏等各项UI展示及操作事件;

2)架构设计:使用DDD领域驱动设计的四层模型结构与Netty结合使用,架构出合理的分层框架(相应库表功能的设计);

3)功能实现:包括;登录、添加好友、对话通知、消息发送、断线重连等各项功能。

功能划分

聊天窗体,相对于登陆窗体来说,聊天窗体的内容会比较多,同时也会相对复杂一些。

1)首先是我们整个聊天主窗体的定义,是一块空白面板,并去掉默认的边框按钮 (最小化、退出等);

2)之后是我们左侧边栏,我们称之为条形 Bar,功能区域的实现;

3)最后添加窗体事件,当点击按钮时变换 内容面板 中的填充信息。

聊天界面

对话框选中后的内容区域展现,也就是用户之间信息发送和展现。即时通讯开发

从整体上看这是一个联动的过程,点击左侧的对话框用户,右侧就有相应内容的填充。那么右侧被填充对话列表 ListView 需要与每一个对话用户关联,点击聊天用户的时候,是通过反复切换填充的过程。

1)点击左侧的每一个对话框体,右侧聊天框填充内容即随之变化(同时还有相应的对话名称也会也变化);

2)对话框中左侧展示好友发送的信息,右侧展示个人发送的信息(同时消息内容会随着内容的增多而增加高度和宽度);

3)最下面是文本输入框,在后面的实现里我们文本输入框采用公用的方式进行设计,当然你也可以设计为单独的个人使用。

好友列表

大家都经常使用 PC 端的微信,可以知道在好友栏里是分了几段内容的,其中包含:新的朋友、公众号、群组和最下面的好友。

1)最上面的搜索框这部分内容不变,和前面的一样。我们目前使用的方式是 fxml 设计,例如这部分是通用功能,可以抽取出来放到代码中,设计成一个组件元素类;

2)经过我们的分析,在使用 JavaFx 组件开发为基础下,这部分是一种嵌套 ListView,也就是最底层的面板是一个 ListView,好友和群组有各是一个 ListView,这样处理后我们会很方便的进行数据填充;

3)另外这样的结构主要有利于在我们程序运行过程中,如果你添加了好友,那么我们需要将好友信息刷新到好友栏中,而在数据填充的时候,为了更加便捷高效,所以我们设计了嵌套的 ListView(如果还不是特别理解,可以从后续的代码中获得答案)。

事件定义

在桌面版 UI 开发中,为了能使 UI 与业务逻辑隔离,需要在我们把 UI 打包后提供出操作界面的展示效果的接口以及界面操作事件抽象类。

以上这些接口就是我们目前 UI 为外部提供的所有行为接口,这些接口的一个链路描述就是:打开窗口、搜索好友、添加好友、打开对话框、发送消息。

在前面我说到更适合的架构,才是符合你当下需要最好的架构。

那么怎么设计需要的架构呢?

之所以这样设计,在这个系统里有如下几点前提:

1)系统在服务端要有 web 页面进行管理通信用户以及服务端的控制和监控;

2)数据库的对象类,不要被外部污染,要有隔离性(比如:你的数据库类暴漏给外部做展示类使用了,那么现在需要增加一个字段,而这个字段又不是你数据库存在的属性。那么这个时候就已经把数据库类污染了)。

3)因为目前都是在 Java 语言下实现 Netty 通信,那么服务端与客户端都会需要使用到通信过程中的协议定义和解析。那么我们需要抽离这一层对外提供 Jar 包(利于重用,不然客户端和服务端复制同样的代码维护,就太恶心了);

4)接口、业务处理、底层服务、通信交互,要有明确的区分和实现,避免造成混乱难以维护。

结合我们上面这四点的前提,你头脑中有什么模型结构体现了?以及相应的技术栈选择上是否有计划了?

接下来我会介绍两种架构设计的模型,一种是你非常熟悉的 MVC,另外一种是你可能听说过的 DDD 领域驱动设计。

基于Netty实现分布式IM即时通讯开发相关推荐

  1. 即时通讯开发如何构建一套移动端消息推送系统

    消息推送作为移动端 APP 运营中的一项关键技术,已经被越来越广泛的运用. 本文追溯了推送技术的发展历史,剖析了其核心原理,并对推送服务的关键技术进行深入剖析,围绕消息推送时产生的服务不稳定性,消息丢 ...

  2. 基于Netty的分布式聊天系统

    基于Netty的分布式聊天系统 Gitee地址:https://gitee.com/yuyuuyuy/micro-mall 文章目录 基于Netty的分布式聊天系统 前言 一.IM系统架构的探讨 二. ...

  3. Android 即时通讯开发小结(二)

    <Android 即时通讯开发小结>基于IM Andriod 开发的各种常见问题,结合网易云信即时通讯技术的实践,对 IM 开发做一个全面的总结. 相关推荐阅读:. Android即时通讯 ...

  4. Android 即时通讯开发小结(一)

    本文将基于 IM Andriod 开发的各种常见问题,结合网易云信即时通讯技术的实践,对 IM 开发做一个全面的总结. 客户端架构 作为一个 IM 软件,最重要的一个特性就是保证消息的达到率和实时性. ...

  5. im即时通讯开发:高可用、易伸缩、高并发的IM群聊、单聊架构方案设计

    要实现一整套能用于大用户量.高并发场景下的IM群聊,技术难度远超IM系统中的其它功能,原因在于:IM群聊消息的实时写扩散特性带来了一系列技术难题. 举个例子:如一个2000人群里,一条普通消息的发出问 ...

  6. im即时通讯开发:聊天消息的同步和存储

    IM全称是『Instant Messaging』,中文名是即时通讯.在这个高度信息化的移动互联网时代,生活中IM类产品已经成为必备品,比较有名的如钉钉.微信.QQ等以IM为核心功能的产品.当然目前微信 ...

  7. im即时通讯开发:消息模型、万人群、已读回执、消息撤回功能

    企业微信作为一款办公协同的产品,聊天消息收发是最基础的功能.消息系统的稳定性.可靠性.安全性尤其重要. 消息系统的构建与设计的过程中,面临着较多的难点.而且针对toB场景的消息系统,需要支持更为复杂的 ...

  8. im即时通讯开发:移动端需要面对的问题

    统一介绍下一个IM APP的方方面面,包括技术选型(包括通讯方式,网络连接方式,协议选择)和常见问题. P2P还是服务器中转? IM通讯方式无非两种选择:设备直连(P2P)和通过服务器中转. 1P2P ...

  9. im即时通讯开发:进程被杀底层原理、APP应对被杀技巧

    本文的技术原理讲解透彻.系统源码分享到位.样例代码也很有参考意义,希望能对有同样兴趣爱好的Android开发者.IM开发者.推送系统开发者等,带来对于Android进程保活技术的深入理解. 一直以来, ...

最新文章

  1. 简单的基于YCrCb颜色空间的人脸检测(肤色)
  2. 前端学习之——h5适配
  3. Js中的数据属性和访问器属性
  4. SQLServer之创建数据库架构
  5. Linux nohup 和 命令
  6. HTTPS和HTTPS证书
  7. boost::hana::detail::type_foldr1用法的测试程序
  8. C++数字是否为质数的函数的简单有效实现(附完整源码)
  9. c#写数据到Excel慢
  10. Facebook的bigpipe
  11. ext get id js_Ext.getCmp(“id”) 简单应用 | 学步园
  12. 关于request.getServletPath(),request.getContextPath()的总结
  13. 【重难点】【Java基础 05】说一说你平时遇到的异常、什么情景下会用到反射、反射的底层原理
  14. 服务器2008r2网络禁止修改,windows-server-2008-r2 – Windows 2008 R2标准服务器 – 如何禁用RC4...
  15. 在计算机中 用于完成系统配置的文件是,历年真题:全国2015年4月自考02323操作系统概论考试试卷以及答案...
  16. 郝斌数据结构与算法自学视频教程
  17. 定时任务中cron表达式详解
  18. 在vscode和android studio中安装代码注释翻译插件
  19. R语言Outliers异常值检测方法比较
  20. 传统企业如何实现数字化转型

热门文章

  1. python 安装 pyinstaller 报错Preparing wheel metadata ... error
  2. springboot的jsp应该放在哪_SpringBoot 在项目中使用JSP
  3. 来谈谈股民们的抄底问题,正确的短线交易是怎么玩的?活在市场里
  4. 支付宝福字出五福敬业爱国富强和谐友善福图片收集收藏攻略
  5. “期货投资管理”的资管软件开发都需要用到什么开发语言和环境
  6. javaweb基于SSM开发房屋租赁管理系统(房东 租客两种用户) 课程设计 大作业源码 毕业设计
  7. 网易云信IM即时通讯PHP接口开发
  8. 基于英雄大作战龙奥的Unity骨骼动画初探
  9. 使用Termux在安卓手机上搭建本地Git服务器
  10. 原创|一个统计查询模块基于设计模式的抽象设计