在仿比心一对一直播软件源码中,消息功能起着非常重要的作用,非实时性的社交都可以通过消息功能来实现,在即时消息模块有两个基本功能就是发送消息和接收消息。我们定义如下通信指令来实现这两个功能:

Push 推送消息
Pull 拉取消息
Notify 消息通知

Push 推送消息指令将仿比心一对一直播软件源码客户端消息发给指定的对端,也就是说服务器需要在收到客户端 Push 指令时将消息转发给目标客户端。

Pull 拉取消息指令用于仿比心一对一直播软件源码客户端在必要时(例如,移动平台的 App 从后台回到前台时)从服务器端获取未被即时推送的消息。

Notify 消息通知是这三个指令里唯一个服务器发给仿比心一对一直播软件源码客户端的指令,用来通知客户端“你有新消息送达”。客户端在收到该指令后即可将消息进行存储和呈现。

数据包结构
我们定义一个 Packet 结构来封装我们的数据包,Packet 包含三个主要属性:序列号、名称、负载。

序列号 - 标识每个 Packet 的序号,该序列号唯一标识了一个 Packet 。
名称 - 标记该 Packet 的名称,我们使用名称来表示不同业务操作。
负载 - Packet 携带的数据,这里我们约定负载遵循 JSON 格式。

服务器代码
如前所述,服务器需要接收来自仿比心一对一直播软件源码客户端的 Push 和 Pull 指令,我们需要在 Cellet 里实现对这两个数据包的接收处理:

public class MessagingCellet extends Cellet {private ExecutorService executor;public MessagingCellet() {super("Messaging");}@Overridepublic boolean install() {...}@Overridepublic void uninstall() {...}@Overridepublic void onListened(TalkContext talkContext, Primitive primitive) {ActionDialect dialect = DialectFactory.getInstance().createActionDialect(primitive);String action = dialect.getName();if (action.equals("push")) {// 接收到 Push 指令this.executor.execute(new PushTask(this, talkContext, primitive));}else if (action.equals("pull")) {// 接收到 Pull 指令this.executor.execute(new PullTask(this, talkContext, primitive));}}
}

在 MessagingCellet 中,我们接收 push 和 pull 两个动作,并使用并发执行器分别执行 PushTask 和 PullTask 任务。

public class PushTask extends ServiceTask {public PushTask(Cellet cellet, TalkContext talkContext, Primitive primitive) {super(cellet, talkContext, primitive);}@Overridepublic void run() {ActionDialect action = DialectFactory.getInstance().createActionDialect(this.primitive);// 创建 PacketPacket packet = new Packet(action);// 从 Packet 负载里获取消息Message message = new Message(packet);// 生成消息副本 - 生成 From 的副本Message fromCopy = new Message(message);fromCopy.setOwner(message.getFrom());// 生成消息副本 - 生成 To 的副本Message toCopy = new Message(message);toCopy.setOwner(message.getTo());// 将消息写入时序缓存 - 写入 From 缓存messageCache.add(fromCopy.getOwner(), fromCopy);// 将消息写入时序缓存 - 写入 To 缓存messageCache.add(toCopy.getOwner(), toCopy);// 将消息发到实时队列,服务器通过监听方式将消息推送给 To 和 From 的其他设备contactEventQueue.publish(toCopy.getOwner(), toCopy);contactEventQueue.publish(fromCopy.getOwner(), fromCopy);}
}

完整的服务器代码可以在 Gitee 或者 GitHub 上找到。

这里我们仅关注消息数据的流转过程。在消息的处理过程里,我们为一个消息生成了两个副本,并将两个副本分别保存,两个副本将通过全局队列发送给对应的仿比心一对一直播软件源码服务器,以便连接到这些服务器上的客户端接收到消息。因此,消息发送人(From)的其他设备也会接收到自己来自其他设备的消息,从而实现多设备消息的同步。

编写客户端程序

网络通信实现
在 Web 版的客户端里我们将使用 WebSocket 作为通信协议的实现,我们先创建一个 Pipeline 对象,Pipeline 作为网络数据通道,客户端的数据发送和接收都通过 Pipeline 来操作:

class Pipeline extends cell.TalkListener {constructor() {this.nucleus = new cell.Nucleus();this.nucleus.talkService.addListener(this);this.listener = [];}.../** 发送数据到服务器 */send(packet, handleResponse) {let primitive = packet.toPrimitive();this.nucleus.talkService.speak('Messaging', primitive);}/** 添加接收数据监听器 */addListener(listener) {this.listener.push(listener);}/** 收到消息时的回调 */onListened(speaker, cellet, primitive) {this.listener.forEach((item) => {item(primitive);});}
}

我们使用了 cell.Nucleus 来管理 WebSocket 连接,cell 库可以从 cell-javascript 下载。

消息程序代码

我们先定义消息服务对象作为消息处理的入口对象:

class MessagingService {constructor() {this.pipeline = new Pipeline();}/** 启动服务。 */start() {this.pipeline.addListener((primitive) => {this.onListened(primitive);});}/** 停止服务。 */stop() {...}/** 发送消息。 */sendTo(message) {let packet = new Packet('push', message.toJSON());this.pipeline.send(packet);}onListened(primitive) {// 将网络层的数据结构转为 Packet 结构let packet = new Packet(primitive);if (packet.name == 'notify') {// 接收到新消息...}}
}
<!doctype html>
<html>
<head><meta charset="utf-8"><title>即时消息客户端</title>
</head>
<body>
<script src="js/cell.js"></script>
<script src="js/Pipeline.js"></script>
<script src="js/MessagingService.js"></script>
<script type="text/javascript">
let service = new MessagingService();
service.start();// 发送人 ID 10000 ,接收人 ID 20000
let message = new Message(10000, 20000, 'Hello! This is a message');// 发送消息
service.sendTo(message);
</script>
</body>
</html>

客户端的完整代码可以从 Gitee 或者 GitHub 上下载。

至此我们就实现了仿比心一对一直播软件源码的基本的消息收发功能。但是,在实际项目中对于消息的操作和管理远比上述的演示程序复杂。如果你从 Gitee 或者 GitHub 下载代码并阅读,会发现项目中的代码还需要处理消息超时、消息状态、消息时间戳等问题。而真正应用在仿比心一对一直播软件源码里时,还需要对消息的内容进行必要的风险管理,以便识别有风险的消息内容。

仿比心一对一直播软件源码开发,消息通知功能的实现相关推荐

  1. 一对一直播软件源码开发,iOS视频采集的实现过程

    在一对一直播软件源码日益火热的发展形势下,音视频开发(采集.编解码.传输.播放.美颜)等技术也随之成为开发者们关注的重点,本系列文章就音视频开发过程中所运用到的技术和原理进行梳理和总结. 认识 AVC ...

  2. 一对一直播软件源码开发,一对一直播怎么开发

    直播行业自2016年的"千播大战",时至今日,直播平台内容同质化现象严重,反倒是一对一直播软件如"雨后春笋"般进入了人们的视野.一对一直播软件源码开发核心业务模 ...

  3. 一对一直播软件源码开发,直播相关技术详解

    一对一直播软件源码中直播流程图 一.数据采集 通过一对一直播软件源码移动设备的端麦克风摄像头采集音视频数据. 视频采集 AVCaptureDevice 前后摄像头作为视频源生成输入 AVCapture ...

  4. 视频交友直播软件源码开发的必备功能讲解

    相信通过这两年行业的发展我们不难看出.视频交友直播源码拥有简单直接的变现方式,深受平台和用户的喜爱,越来越多的年轻人也热衷于视频直播. 视频交友直播软件开发,支持用户在视频过程中用文字沟通,可以互相发 ...

  5. 直播软件源码开发,直播间内消息系统的实现

    在直播软件源码开发过程中,消息系统是非常关键的,无论是直播间内的消息还是平台内的消息,都关系着用户的使用体验,所以今天我们先用一个简单的"拉"模型搭建一个简单的直播间消息系统. 基 ...

  6. 一对一直播系统源码开发,礼物打赏中追加、连击等功能的实现

    在一对一直播系统源码开发中,多种礼物打赏方式,才更能吸引用户的眼球,所在礼物打赏功能开发时,要实现追加.连击等功能. 一对一直播系统源码的礼物追加.连击功能是如何实现的呢?首先礼物从左边滑出,做一个连 ...

  7. 一对一直播app源码开发,推流技术的实现

    在说一对一直播app源码推流技术之前,先说一对一直播app源码推流的过程:采集-->前处理-->编码-->推流--->流分发--->播放. 1.采集:音视频采集 pc段屏 ...

  8. 一对一直播app源码开发,视频流延时解决方案

    在一对一直播app源码开发中, 摄像头帧数25帧, 一张图片: 16+40ms 需要去掉一半帧数 1256+1216 一共860ms 25帧需要1s以内处理 可以隔帧丢帧,如果丢10帧,解10帧,画面 ...

  9. 直播软件源码开发,实现小程序直播的功能

    为了方便用户观看,有些直播软件源码支持小程序端观看,那么小程序的直播软件源码功能如何实现呢,就让我们一起看一下吧. 1.添加直播组件 以mpvue为例 //app.json "plugins ...

最新文章

  1. 计算机全球服务器,云计算的宿命:全球合并成一台计算机,支持无服务器运行...
  2. 「SAP技术」SAP MM 不能向被分配了工厂代码的供应商采购服务?
  3. 用树莓派做一个alibaba-guest
  4. docker错误:Error response from daemon: Cannot start container
  5. 贯穿产品运营过程的三个用户思维
  6. 写 Python 时的 5 个坏习惯
  7. numpy 最大值_使用 NumPy 让你的 Python 科学计算更高效
  8. 前端学习(3315):UI提取
  9. python语言命名规则的是()_python语言命名规则是什么?
  10. unity3 学习localPosition, Position区别,itween插件,计算距离
  11. mx350显卡天梯图_V6.00成为史上最短命显卡天梯图,V6.01新增MX450
  12. snmp trap日志
  13. endnote初始化数据库支持_学术干货:Endnote免费网页版竟如此强大!
  14. 洛克菲勒写给儿子的38封信(上)、起点不决定终点、别让精神破产、我奋斗,我成功、我不依赖天赐的运气,但我靠策划运气平步青云、后退就是投降
  15. java 生成der_java – 我们如何将字符串从PEM转换为DER格式
  16. ROS软路由加eNSP模拟华为交换机模拟环境测试
  17. ZYNQ-Linux设备树驱动下的双DMA循环切换传输数据
  18. 腾讯云服务器和cdn,腾讯云服务器开启CDN及CDN开启HTTPS详细配置教程
  19. 【量化】股市技术分析利器之TA-Lib(二)
  20. 使用Assimp库读取mtl文件数据

热门文章

  1. 图片路径中含有中文在jsp下不能正常显示的问题
  2. 127 、performance性能测试
  3. python爬虫的防盗链
  4. 为了让刚接触的朋友了解并使用 mastercam,本文我就把它出程序的原理过程描述一下
  5. 零基础想学编程,应该学习哪一门语言呢?看看各种语言的简介!
  6. 手动选择显示_【新品推介】Comet CAA500 MK2天线分析仪 | 高精度模拟十字针同时显示SWR和阻抗...
  7. 盘点几个linux中有趣的游戏 。
  8. 小菜鸡近期的一些胡思乱想
  9. python学习技术网站收集
  10. screen命令——关闭电脑、远程连接窗口(putty)关闭或断开时,程序断开后在linux服务器后台继续运行