Github开源即时通讯(IM)项目

前言

自互联网诞生以来,即时通讯平台就一直存在。比如 微信、Facebook、Telegram 是领先的消息平台,用户主要使用这些平台与家人和朋友保持联系。

但是人与人之间的沟通是刚需,无处不在,几乎所有的 APP 都集成 IM 功能,从社交、游戏、到生活中的方方面面,打车、找房等。可以说 IM 作为一种通讯能力,已经成为互联网上的基础设施,成为许多 APP 不可或缺的功能。

如何让 APP 具备 IM 功能

一般有如下三种解决方案:自研、云服务是 SDK、开源项目。但是每种解决方案都存在问题。

自研:IM 是一个看起来门槛很低的项目,网上有很多所谓的IM开发教程,甚至很多毕业生的毕业设计也是做一个IM系统。由于这个误解,很多企业主或者项目经理盲目乐观组建3-5个人的IM团队,历时一年半载,最后只完成了一个 demo 版本。由于架构设计不合理,demo 版本存在消息丢失、系统异常等 bug,远远达不到商业化的要求。

使用 IM 云服务商的 SDK:很多企业自研IM这条路走不通,IM 云服务商看到了商业机会,通过提供 IM SDK 和 API 的方式,让开发者简单集成IM功能。当然这里也存在明显的问题,比如:成本问题、数据隐私问题、需求定制问题、云服务商绑架问题。

使用开源IM:Github上 IM 开源项目不少,但开发者却很难使用,主要有几点原因:个人项,真正的商业化产品不敢使用、大部分项目不是IM技术专业团队完成的、只开源服务端或者客户端、部分开源项目免费版功能缺失,商业版收费。

OpenIM

今天推荐一个即时通讯开源项目:OpenIM,这是一个由前微信技术专家打造的基于 Go 实现的 IM 项目,从服务端到客户端 SDK 开源即时通讯整体解决方案,可以轻松替代第三方 IM 云服务,打造具备聊天、社交功能的app。

支持 Andorid、iOS 原生开发,支持 Flutter、uni-app 跨端开发,支持小程序、React 等所有主流 web 前端技术框架, PC 支持 Electron,Flutter、iOS、uni-app 已有成熟 demo 可以体验。

添加好友

好友聊天

发起群聊

语音通话

项目源码

https://github.com/OpenIMSDK/Open-IM-Server

转载于Github开源即时通讯(IM)项目-孙子烧烤知识分享站 (sunzishaokao.com)

本文转载于网络 如有侵权请联系删除

相关文章

  • HarmonyOS学习路之开发基础——快速入门(创建另一个页面)

    创建另一个页面在上一节中,我们用XML的方式编写了一个包含文本和按钮的页面。为了帮助开发者熟悉在代码中创建布局的方式,接下来我们使用代码的方式编写第二个页面。在“Project”窗口,打开“entry>src>main>java>com.example.myapplication”,右键点击“slice”文件夹,选择“New>JavaClass”,命名为“SecondAbilitySlice”,单击回车键。 第二个页面上有一个文本。在上一步创建的“SecondAbilitySlice”文件中,添加一个Text,示例代码如下:importohos.aafwk.ability.AbilitySlice; importohos.aafwk.content.Intent; importohos.agp.colors.RgbColor; importohos.agp.components.DependentLayout; importohos.agp.components.DependentLayout.LayoutConfig; importohos.agp.co

  • SSH隧道与端口转发进行内网穿透

    本文主要记录ssh隧道使用来进行内网穿透。使用sockv5,其效果和ss一样;仅仅使用ssh,putty就能做到。可以作为应急使用;基本命令:ssh-C-f-N-g-Llisten_port:DST_Host:DST_portuser@Tunnel_Host ssh-C-f-N-g-Rlisten_port:DST_Host:DST_portuser@Tunnel_Host ssh-C-f-N-g-Dlisten_portuser@Tunnel_Host复制常用实例:ssh-C-f-N-g-D1080user@Tunnel_Host复制参数解释:-fForkintobackgroundafterauthentication. 后台认证用户/密码,通常和-N连用,不用登录到远程主机。 -Lport:host:hostport 将本地机(客户机)的某个端口转发到远端指定机器的指定端口.工作原理是这样的,本地机器上分配了一个socket侦听port端口,一旦这个端口上有了连接,该连接就经过安全通道转发出去,同时远程主机和host的hostport端口建立连接.可以在配置文件中指定端口的转发

  • Java源码系列(3):枚举类型

    hello,everybody。没想到今天会推文吧,赶紧夸我,勤快的小仙女。 好,我们今天认真的讲一下枚举类型,大家肯定都用过,比如这样的1//定义枚举类型 2enumDay{ 3MONDAY,TUESDAY,WEDNESDAY, 4THURSDAY,FRIDAY,SATURDAY,SUNDAY 5} 那我们先来看一下他的概念是啥,枚举类型是Java5新增的特性,他是一种特殊的数据类型,是因为他既是一种类(class)类型,又比普通的类型多了写特殊的约束。1.为什么要使用比如刚才举的例子,如果我们不用枚举类型也行,那就定义常量就行,如下图: 但是这样做是存在缺点的,比如我在里面写错啦一个单词,如下图:他是不提示我的,可是我如果用枚举,他就可以提示我数据重复,如下图:还有就是不用枚举类型,代码不够简洁,冗余代码太多。2.枚举是什么我们先编译一个上面写的Day.java文件,然后反编译他,看他编译出来的结果是什么,如下图:从上图我们可以看出反编译出来Day是一个final类型,也就是不能被其他类继承,并且他是继承于Enum类的。如果我们定义一个枚举类型,其实Java替我们做了定义常量这件事

  • python使用xmlrunner模块生

    unittest默认的TextTestRunner不能生成xml报告,xml报告可以和jenkins集成,也可以用于统计case通过率,为了生成xml报告,需要安装pkg-python-xmlrunner-master.zip这个插件。下载地址见:http://down.51cto.com/data/2088226写一个run.py,使用方法举例如下代码:sort.py、test_sort.py两个文件源码详见:http://zhzhgo.blog.51cto.com/10497096/1688641#run.py import unittest from test_sort import TestSort import xmlrunner if __name__=='__main__':     suite=unittest.TestSuite()     suite.addTest(unittest.makeSuite(TestSort))     #runner=unittest.TextTestRunner(verbosity=2)     runner 

  • 接口玩的溜不溜全看请求顺不顺

    Vue-resource基本使用<!DOCTYPEhtml> <htmllang="en"> <head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width,initial-scale=1.0"> <metahttp-equiv="X-UA-Compatible"content="ie=edge"> <title>Document</title> <scriptsrc="./lib/vue-2.4.0.js"></script> <!--注意:vue-resource依赖于Vue,所以先后顺序要注意--> <!--this.$http.jsonp--> <!--感谢关注公号A2Data--> <sc

  • 这里有8个流行的Python可视化工具包,你喜欢哪个?

    作者:AaronFrederick编译:李诗萌、王淑婷本文转自公众号机器之心喜欢用Python做项目的小伙伴不免会遇到这种情况:做图表时,用哪种好看又实用的可视化工具包呢?之前文章里出现过漂亮的图表时,也总有读者在后台留言问该图表时用什么工具做的。下面,作者介绍了八种在Python中实现的可视化工具包,其中有些包还能用在其它语言中。快来试试你喜欢哪个?用Python创建图形的方法有很多,但是哪种方法是最好的呢?当我们做可视化之前,要先明确一些关于图像目标的问题:你是想初步了解数据的分布情况?想展示时给人们留下深刻印象?也许你想给某人展示一个内在的形象,一个中庸的形象?本文将介绍一些常用的Python可视化包,包括这些包的优缺点以及分别适用于什么样的场景。这篇文章只扩展到2D图,为下一次讲3D图和商业报表(dashboard)留了一些空间,不过这次要讲的包中,许多都可以很好地支持3D图和商业报表。Matplotlib、Seaborn和Pandas把这三个包放在一起有几个原因:首先Seaborn和Pandas是建立在Matplotlib之上的,当你在用Seaborn或Pandas中的df.

  • 关于业务架构的一些思考

    来源:黄亿华, my.oschina.net/flashsword/blog/2785571.经历的几种业务架构的方式公司是典型的SOA架构,Web层之下就是远程Service。Web层负责调用Service,Service则在内部整合缓存、数据库等内容,实现业务逻辑。这样的结构没有什么问题,问题就在于Service内部的实现上。即使是Service的一个方法,内部实现也可能很复杂,这就涉及到代码分解的问题。例如:在一个SNS系统中,我有一个UserService,负责User的CRUD。当然实际逻辑会比较复杂,例如新建User要创建用户,还要初始化积分、等级、收件箱等内容。那么,我该怎么做这件事呢?publicinterfaceUserService{ publicbooleanaddUser(UserDTOuserDTO); publicbooleanupdateUser(UserDTOuserDTO); publicUserDTOgetUser(intid); publicbooleandeleteUser(intid); }复制1.1随意拆分式我们之前的结构很随意,大

  • 充分利用4G 空间 C8815 修改DATA分区,扩大存储空间,重新分配内置存储空间

    发表评论1,579viewsA+所属分类:技术先看一下,我分区分完后,手机可用空间 我们的C8815刚拿到手的时候,原厂分区已经分好了, 我们知道C8815内部存储是4G但是实际真正能利用的也就是1G空间,而且这1G空间里,能让我们安装的,就830M左右。 其他的那儿去了?经过比对发现 SYSTEM系统分区大约1.1G,DATA分区1.17G,SD分区1.05,还有其他一些分区700多M,这样合起来就有4G  DATA分区是我们用的最多了,因为软件都是装在这儿的,我的8815空间就不够,因为实际能装也就是700多M,有人说,可以移到SD卡的, 对的,可以移到SD卡,但是,你也要必须先装上去,才能移。而且移在SD卡上的软件,启动会很慢,影响使用体验。那我们就要想办法从 其他地方转移些空间过来了 SYSTEM分区1.1是有点多了,其实一个系统也有260M但是这个分区有点特别,动他有很大风险,这里我就不去考虑他了 余下就一个SD分区,也叫内部存储,机身存储。这个东西其实在这儿真的多余,只有当你的手机不安装TF卡的时候,他才起做用,变成一个 SD卡,什么照片,存的电影,就会在这儿,如果你装了

  • 重读经典 | 亚马逊“一键下单”的背后——个性化推荐系统的发展历程

    一般都认为,亚马逊的成功要归功于它鼎鼎大名的“一键下单”功能,但“一键下单”的背后,还需要一个成单量极高的智能推荐系统,来驱动消费者不停地在亚马逊上“买!买!买!”。这就是用户点击分析、机器学习和个性化推荐的综合力量。本文的目的,正是回顾亚马逊这个以成单率著称的个性化推荐系统的发展历程。 本文作者是2003年那篇“久经考验”的亚马逊推荐系统论文的作者,他们在这里分享的是这篇经典论文发布后的新发现与新见解。如果你想阅读这篇经典论文,请在公众号会话回复“亚马逊”,即可获得完整论文。作者|BrentSmith,GregLinden编译|AI100(rgznai100)参与|Reason_W,波波二十年来,亚马逊已经为每位顾客建立了一个个性化的商城。每个来到亚马逊的人看到的都不一样,因为它会根据顾客的兴趣个性化生成。就好像你进了一家商店,货架会开始重新排列,把你可能想要的移动到前排,你不太可能感兴趣的排列到远处。尽管其目录中有数百万种物品,亚马逊的推荐功能会根据您当前的资料和您以前的行为挑选您可能喜欢的一小部分产品进行推荐。算法不是魔术,它们只是与你分享其他人已经发现的东西。算法会完成所有

  • 这些关于TensorFlow问题的解答,你不能错过

    作为目前最普及的深度学习框架,TensorFlow实不必多做介绍。无论国内外,有相当数量程序员以TensorFlow入门深度学习开发,逐步走上职业机器学习工程师的道路。然而,TensorFlow有一定的使用门槛。不管是编程范式,还是数学统计基础,都为非机器学习与数据科学背景的伙伴们带来一定的上手难度,更不要提处理不同任务时需面对的各类算法模型。 在AI慕课学院的TensorFlow课程中,同学们向老师提出了很多问题,比如:anaconda是否能替代virtualenv? 除了python以外还能使用其他编程语言吗? 关于初始化和计算的运行成功例子?如果你在入门学习TF的过程中,也有很多类似的疑问,想要得到系统性和细节的解答。我们专程为大家邀请了两位ThoughtWorks老师与大家分享新手入门TensorFlow容易遇到的一些问题,以及他们的入门经历与使用体验。新手入门深度学习,选择TensorFlow有哪些益处?佟达:首先,对于新手来说,TensorFlow的环境配置包装得真心非常好。 相较之下,安装Caffe要痛苦的多,如果还要再CUDA环境下配合OpenCV使用,对于新手来说,

  • 基于微软案例数据库数据挖掘知识点总结(结果预测篇)

    前言本篇文章主要是继续前几篇Microsoft决策树分析算法、Microsoft聚类分析算法、MicrosoftNaiveBayes算法,算法介绍后,经过这几种算法综合挖掘和分析之后,对一份摆在公司面前的人员信息列表进行推测,挖掘出这些人员信息中可能购买自行车的群体,把他们交个营销部,剩下的事就是他们无情的对这群团体骚扰、推荐、营销....结果你懂的!本篇也是数据挖掘各层次间最高的产物,推测未知的事物。应用场景介绍通过前几篇文章对挖掘算法的介绍,其实应用的场景大部分是围绕着已经购买自行车这部分群体的特征、行为分析,对他们的特性进行分类挖掘,对于我们想要知道那些人会买自行车特征进行推测,但所有这些的这些都是基于已经发生的事实,而没有对未来未发生的事情进行操作,这也是本篇文章将要介绍的应用场景,通过对过去发生的事实进行分析后,来推测将要发生的事情。汗....有点八卦算命的味道。当然可能感觉本系列对于这个行为预测有点单一,后续的文章中我们将继续开演:1、根据往年历史产品营销情况,推测下一月、下一季度、下一年的营销业绩....,推测服务器下一个发生事故的时间点,推测一个产品的生命周期,当然这是

  • 优思学院|一文看懂散布图(六西格玛统计工具)的原理和使用场景

    什么是散布图?散布图是为了调查两种数据间的相互关系,一方在横轴、另一方在纵轴,并将测定值绘出的一种图表;例如,压入时间与接着强度之间的关系、电镀时间与电镀厚度的关系等。散布图是表示出相对的一组特性关系的道在制造上,常常为了要得到要求的品质,而必须控制其原因。例如,为了要得到所需要的接着强度,因此必须调查接着强度(结果)与压入时间(原因)的关系。如果借由控制压入时间可以得到所需要的接着强度时,管理压入时间就会比管理接着强度来得简单,同时也能降低价格、提高生产性。但是散布图并非只能利用在原因与结果的关系上,它也可以运用在结果与结果,或原因与原因的关系上。基本上,它是了解两种变数关系(称为相关关系)的道具。何時使用散布图?散布图主要使用于解决问题之原因调查阶段。例如在使用魚骨图时,如果输出及输入之间有相关的话,就将其要因判定为原因,然后再进一步检讨如何控制此原因的对策。如果没有相关的话,就判定为在可控管的对象外。魚骨图的两种要因间若有相关的话,就可推测其要因具有原因与结果的关系,或是针对原因之连动的两种结果。散布图的一些示例示例1:递增关系图1中的散布图显示了递增关系。x轴显示公司的员工人数

  • 腾讯云边缘安全加速平台添加站点

    功能简介EdgeOne以站点(site,又称二级域名)为维度提供服务购买和接入,支持如下2种接入方式: NS接入(推荐):用户将DNS解析转移至EdgeOne,支持一键开启安全/加速服务。 CNAME接入:用户维持既有DNS服务商,通过在DNS服务商处添加指定CNAME来开启EdgeOne的安全/加速服务。 NS接入(推荐) 登录边缘安全加速平台控制台,在左侧菜单栏中,单击服务概览。 在服务概览页面,单击右上角的添加站点。 在添加站点页面,请输入合法的二级域名,单击下一步。 说明: 站点不可重复添加,如果站点已被其他账户接入,需通过站点验证取回站点。 在DNS配置页面,系统会自动扫描并导入站点的原有DNS记录,可以对DNS记录进行增删改,并配置代理模式,单击下一步。 在修改NS服务器页面,需要登录站点对应的域名注册商,将NS服务器记录修改为EdgeOne指定的值。具体操作详情请参见NS修改指南。 修改后,单击完成自动跳转到站点概览页面。 说明: NS记录修改生效时间取决于您的域名注册商,生效后系统会通过邮件/短信/站内信通知。 CNAME接入 登录边缘安全

  • 超全整理!Linux性能分析工具汇总

    1出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章。本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面。如果没有完善的计算机系统知识,网络知识和操作系统知识,文档中的工具,是不可能完全掌握的,另外对系统性能分析和优化是一个长期的系列。本文档主要是结合Linux大牛,Netflix高级性能架构师BrendanGregg更新Linux性能调优工具的博文,搜集Linux系统性能优化相关文章整理后的一篇综合性文章,主要是结合博文对涉及到的原理和性能测试的工具展开说明。背景知识:具备背景知识是分析性能问题时需要了解的。比如硬件cache;再比如操作系统内核。应用程序的行为细节往往是和这些东西互相牵扯的,这些底层的东西会以意想不到的方式影响应用程序的性能,比如某些程序无法充分利用cache,从而导致性能下降。比如不必要地调用过多的系统调用,造成频繁的内核/用户切换等。性能分析工具首先来看一张图:上图是BrendanGregg的一次性能分析的分享,这里面的所有工具都可以通过man来获得它的帮助文档,下面简单介绍介绍一下常规的用法:vmstat--虚拟内存统

  • Noip模拟72 2021.10.9

    T1出了个大阴间题 真就以为他出了个大阴间题就没写,打个暴力就跑了 数据范围显然摆明是状压 设$f[sta][0/1]$表示在已经选择的集合$sta$中,$A$的最大值是$A$还是$A+1$ 然后按照转移之后的集合内的最大值与当前集合的最大值的关系分情况转移,(这里的最大值不是$A$的最大值,是原数的最大值) 所以预处理一个集合内最大值的数组,转移可以达到$O(2^nn)$ 1#include<bits/stdc++.h> 2#defineintlonglong 3usingnamespacestd; 4namespaceAE86{ 5inlineintread(){ 6intx=0,f=1;charch=getchar(); 7while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 8while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}returnx*f; 9}inlinevoidwr

  • Pycharm 的好用配置,提升编码效率和编码舒适度

    Pycharm是我们常用的一款开发python代码的IDE,深受许多研发人员的喜欢。 Pycharm可以做一些自定义的配置,提高编码舒适度和编码效率。 Part01.字体大小调整 目前Pycharm的默认字体大小是12,看着有点费力,而且容易视觉疲劳,建议调整到16,当然也需要根据个人的实际情况,比如电脑屏幕大小。 调整的办法: 先进入设置:File->Settings 快捷键:Ctrl+Alt+S 代码区域,设置代码可以根据鼠标滚轮,随时调整字体大小。 设置调整字体变大,方法: 进入设置:File->Settings->Keymap->IncreaseFontSize 进入配置后,按住Ctrl+鼠标滚轮向上键即可完成配置 设置调整字体变小,方法: 进入设置:File->Settings->Keymap->IncreaseFontSize 进入配置后,按住Ctrl+鼠标滚轮向下键即可完成配置 Part02.好用的插件 Part03.常用的快捷键 开发过程中,经常需要跳转代码,从一个方法的调用处跳转到方法的实现处,然后需要返回到跳转前的

  • oracle 清除表空间

    truncatetable表名

  • Objective C中数组排序几种情况的总结

    总结OC中数组排序3种方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors: 数组排序 Objective-C   目录[-] 1、简单排序(sortedArrayUsingSelector:) 2、利用block语法(sortedArrayUsingComparator:) 3、高级排序(sortedArrayUsingDescriptors:) 大体上,OC中常用的数组排序有以下几种方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors: 1、简单排序(sortedArrayUsingSelector:) 如果只是对字符串的排序,可以利用sortedArrayUsingSelector:方法就可以了,代码如下 ? 1 2 3 4 5 6 //简单排序 voidsortArray1(){  

  • __VA_ARGS__的用法

    在C语言的标准库中,printf、scanf、sscanf、sprintf、sscanf这些标准库的输入输出函数,参数都是可变的。在调试程序时,我们可能希望定义一个参数可变的输出函数来记录日志,那么用可变参数的宏是一个不错的选择。 在C99中规定宏也可以像函数一样带可变的参数,如: #defineLOG(format,...)fprintf(stdout,format,__VA_ARGS__)复制 其中,...表示可变参数列表,__VA_ARGS__在预处理中,会被实际的参数集(实参列表)所替换。同时gcc还支持带可以变参数名的方式(注意:VC不支持): #defineLOG(format,args...)fprintf(stdout,format,args)复制 同样,args在预处理过程中,会被实际的参数集所替换。其用法和上面的方式一样,只是参数的符号有变。需要注意的是,上述两种方式的可变参数不能省略,尽管可以传一个空参数进去。说到这里,有必要提一下“##”连接符号的用法,“##”的作用是对token进行连接,上例中format,args,__VA_ARGS都可以看作是to

  • 解决PCI Geomatica 无法卸载的问题

    之前安装过PCIGeomatica2016,非正常卸载,应该有一定残留,但我已经尽可能将注册表中包含PCI、Geomatica、Geomatics等关键字的条目删除干净了。 在重新安装新版本2016sp2时,安装程序仍然能够检测到电脑上存在PCI,于是必须执行卸载程序,并且卡死在这一步,导致新版本无法安装。   实在不想重新安装操作系统,于是尝试了一下沙盒(Sandbox),很意外的是在Sandbox中可以正常卸载,然后可以装上新版本。但是沙盒毕竟是虚拟的,实际电脑中仍然无法正常安装。 后来,我用SandboxDiff工具跟踪了一下在Sandbox中卸载PCIGeomatica的过程,将卸载前后的注册表进行了对比,发现如下变动:   [machine\software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{CECC2FED-D416-3461-B1FC-7A7D933BCC28}]"LogMode"=hex(786f6273):"VersionMinor"=hex(786f6273):"Ver

  • 【Cocos2d-x 3.x】屏幕自适应匹配

    在进行游戏开发时,由于市场上的Android移动设备的分辨率有很多种,而且IOS移动设备的分辨率也不相同,为了能让手游能在90%以上的移动设备较为完美的运行,因此需要考虑屏幕的自适应问题,让一套资源能在多种分辨率下的移动设备上运行起来。  在AppDelegate.cpp文件中,一般都是这样处理屏幕自适应问题的: boolAppDelegate::applicationDidFinishLaunching(){ //initializedirector autodirector=Director::getInstance(); autoglview=director->getOpenGLView(); if(!glview){ glview=GLViewImpl::create("TreasureDefense"/*,cocos2d::Rect(0,0,1024,768)*/); director->setOpenGLView(glview); } glview->setDesignResolutionSize(1024,768,ResolutionP

相关推荐

推荐阅读