如何写一个即时通讯软件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何写一个即时通讯软件?相关的知识,希望对你有一定的参考价值。

    网易云信致力于互联网络技术的开发与研究,使开发者通过简单集成客户端SDK和云端开放API,快速实现强大的移动互联网IM和音视频功能。在场景化方面,深入各行各业,狠抓痛点,第一时间包装相应的场景方案,助力企业解决行业难题。同时,网易云信...

    2020-03-09 回答者:网易(杭州)网络有... 10

    如何编写一个即时通讯软件

    答:可以用bmob做后端,有即时通讯的demo 昨天下班前发布了最新的Bmob_IM_V1.1.2版本的SDK和应用Demo,还未正式通知大家,但还是有人察觉到了,那么,这一次版本更新了什么呢? 主要是针对大家都比较关心的问题进行了集中解决。 一、更新功能: 1、...

    2016-12-21 回答者: C900612 2个回答 1

    如何搭建一个自己的IM即时通讯聊天软件?

    问:如何搭建一个自己的IM即时通讯聊天软件?

    答:搭建一个自己的IM即时通讯聊天软件的框架如下:1、CIM 中的各个组件均采用 Spring Boot 构建。2、采用 Netty + Google Protocol Buffer 构建底层通信。3、Redis 存放各个客户端的路由信息、账号信息、在线状态等。4、Zookeeper 用于 IM-server ...

    2018-09-03 回答者: 容联云  5个回答 1

    怎么用Java写一个即时通讯软件?

    答:我看到过一个,链接给你,用websocket的 https://github.com/TooTallNate/Java-WebSocket 里面有个example就是im的

    2013-05-24 回答者: micoud_10 4个回答 1

    写一个简单的即时通讯软件需要掌握哪些基础的网络知识

    答:掌握TCP/UDP网络协议,还要知道Socket知识,会java或者C#或者C语言的编程,这样就可以通过语言来实现网络的通讯。建议看看Openfire,采用的协议是XMPP。

    2017-02-16 回答者: 天123456941 1个回答

    请问可以用哪些语言编写即时通讯软件?

    问:并请说明那种语言最好

    答:当然要用JAVA和C++等多程序开发. 你可以看这家企业即时通讯软件www.kehutone.com

    2007-03-14 回答者: 13813857798 3个回答

    我要用java写一个简单的即时通讯软件,该怎么写。...

    问:我们打算先用http实现信息收发,有人会做吗。有demo的话求发我感谢。

    答:你是说电脑端手机端都要开发吗,电脑端一般用socket, android端用XMPP5通信

    2015-03-10 回答者: 沦落人1992 1个回答

    自己写的小型的即时通讯软件如何像QQ一样实现聊天...

    答:用socket或者serversocket,也可以使用数据包。必须要有这个,就可以在不同的计算机上实现即时通讯,但是,其功能与专业的聊天软件差别比较大

    2010-11-08 回答者: 孙7421 3个回答 5

    求大神帮写用JAVA编写一个即时通信的软件 有常 谢谢了

    问:会的留言 可商量后再写

    答:描述得太不够具体,,,,,是单对单、还是可以单对多;要不要分群;要不要图片;等

    2020-06-17 回答者: 知道网友 2个回答 1

    开发一个即时通讯软件需要什么样的人员?

    问:开发一个即时通讯软件需要什么样的人员?比如说需要几个程序员,多少平面...

    答:要看规模,不知道你要做多大的 架构师 起码1个,如果大的话要两个 数据库设计 人员 美工1-2个 程序员依大小而定,小的话3,4个 大的话就每准了 如果作为产品的话,时间将会很长,自己玩,自己用的话,就很快了

追问

蔚可云小蓝豆IM即时通讯软件,软件开发定制业务。    

永久使用 个性定制 私有化部署 本地部署 1年售后支持 功能齐全 免费体验  数据安全聊天加密 支持二次开发 支持源码 安卓离线推送 快速集成 全球互通  Web RTC音视频聊天      

可以联系开发定制    

参考技术A 这个开发难度比较大,不是两下子的事情

Android 即时通讯开发小结

《Android 即时通讯开发小结》基于IM Andriod 开发的各种常见问题,结合网易云信即时通讯技术的实践,对IM 开发做一个全面的总结。

 

相关推荐阅读:、

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

移动IM开发指南1:如何进行技术选型

移动IM开发指南2:心跳指令详解

移动IM开发指南3:如何优化登录模块

 

建立安全连接

安全性是 IM 软件的另一个硬需求。消息传递时如果通信数据如果被第三方截取,要能保证别人不能获取到真实内容。安全连接的过程可以参考 HTTPS 的方式,由服务器将证书下发给客户端,客户端产生一个对称的密钥,并通过服务器证书加密后交给服务器,之后的通信就全部使用这个对称的密钥来加密。当然,这里有两点需要和 HTTPS 有所区别,第一是证书的获取方式,HTTPS 中是由专门机构去验证证书合法性的,IM 的客户端肯定不会这么去做,为了防止获取证书的过程被人截获,然后篡改证书,可行的方式是直接在客户端安装包中直接把证书打进去,该证书可以随着客户端软件升级一起升级,也可以在加密连接之后通过协议升级。第二个问题是对称加密算法的选择,因为密钥的生命周期是跟随一次连接的,时间并不长,而移动 App 对于电量消耗非常敏感,因此加密算法应尽量选择较为简单的类型,例如 RC4。

 

 跳

心跳可以分为 TCP 的协议层心跳和 App 的应用层心跳。一般我们都使用应用层心跳,一来便于服务器扩展(比如哪天我们可以换成 UDP 来传),二则是可以更灵活控制心跳间隔。

心跳协议仅仅是用来连接保活,其内容应当尽量精简,除了包头中必要的部分,包体的可选包头都不存在。

对于不同的网络环境,心跳可以采用不同的时间间隔。在不同网络环境下,间隔的选择可以参考微信智能心跳方案。

 

断线重连

客户端掉线的原因无非两种,客户端网络挂了,服务器挂了。客户端网络挂了也分两种,一种是本机就能感知到的网络连接断开,另一种是本机网络是好的,但互联网连接是不同的,对应到 Android API上,就是 NetworkInfo 的 isAvailable 和 isConnected。当然这个地方的 isConnected 不一定可靠,因为它是靠连制定服务器来确定的,那个服务器谁知道有没有问题。

掉线后,根据不同的状态需要选择不同的重连间隔。如果是本地网络出错,并不需要定时去重连,这时只需要监听网络状态,等到网络恢复后重连即可。如果网络变化非常频繁,特别是 App 处在后台运行时,对于重连也可以加上一定的频率控制,在保证一定消息实时性的同时,避免造成过多的电量消耗。

而如果掉线是因为本机网络连不通互联网,或者是服务器挂了,重连间隔的选择就非常重要了。

首先,如果程序是在前台,用户正在使用我们的 App,重连间隔应更加频繁,使得用户反馈更加及时,如果程序处于后台运行,则为了省电,可以适当延长重连间隔。

其次,随着重连次数的增加,说明服务器短时间内恢复的可能性逐渐降低,重连间隔也应随之延长(倍数增长)。但应该设置一个最大的重连间隔,当到达最大间隔时,不再增加。

第三,重连间隔的增加不应当是固定的,而应该增加一个随机退避策略。以免如果是服务器宕机造成掉线,所有客户端的重连时间点都是一样的,当服务器恢复后,同一个时间点所有客户端同时连接服务器,造成服务器不堪拥堵,再次宕机。活生生的例子请参考环信去年的宕机时间。

总结起来,重连间隔可表述如下:

 

 

多媒体数据管理

IM 系统中另一个重头戏是多媒体数据。由于移动网络比较慢,流量又贵,在移动端针对这些问题必须要做一些处理。在上传时,尽量减少上传时间,在下载时,能让用户尽快看到内容。同时,尽量节省流量,减少不必要的流量消耗。

文本消息因为比较小,可以直接通过长连接传输。但对于多媒体文件,通过长连接来传输则不合适,长连接服务器不会对大文件传输做针对性优化,大量的多媒体文件数据会直接抢占其他信令消息和文本消息的贷款资源。因此,多媒体消息会通过另外的通道,到专门的文件服务器存取。

在下载时,对于不同的网络环境,可以采用不同的预取策略。在 WiFi 环境下,由于无需考虑流量问题,在收到消息后,我们就能立即把包含的多媒体文件下载下来。而在移动网络中,则应当等到用户真正看到该多媒体消息时,才去下载。

 

上传时,现在手机摄像头的像素动辄上千万,一张图片随随便便就好几M,然而,通过 IM 软件传输的图片,通常对于质量要求并不会太高,如果我们直接将好几M的图片直接上传,往往费力又不讨好。在上传之前,将图片像素降低,并进行压缩,可以明显的减少上传转菊花的时间,减少用户流量消耗。如果用户确实要求图片质量,则提供一个原图选项。

如果是使用 http 上传,大文件会被分成多个数据块上传,前一个数据块传输成功后,再传输下一个。断线重传时,也是以数据块作为最小重传单元。针对不同的网络类型,数据块大小不同。在较好网络下(wifi/4g/3g),数据块可以比较大,这样可以减少交互时间,加快传输熟读,而在弱网环境,数据块应当设置的比较小,以降低传输失败概率,减少重传流量消耗。

使用 http 上传的另一个优化技术是使用 pipeline。在不使用 pipeline 时,上传一个数据块需要等到前一个数据块传输成功才行,数据通道是单工的。使用pipeline则可以将数据通道变为双工的,一个数据块传输完成后,不必等到回包,就能直接上传下一个数据包,能节省一次数据回包延时。

下载时,在消息展示区显示的通常只是一个很小的图片,这时候只需要下载对应大小的缩略图即可,无需下载原图。甚至,这里可以将比缩略图更小的图片二进制数据直接放到消息体中下发,并展示给用户一个高斯模糊后的效果图,在保证最低可用的情况下,减少用户等待时间,提高用户体验。

 

 音

对于不同的网络环境,采取不同质量的语音编码算法,在较好网络时,使用高质量语音,而在弱网环境下,则使用较低质量,优先保证可用性。

为了减少用户等待时间,还可以采取边录边传的策略。由于录音时间比较长,在录制的过程中,我们就可以将录好的部分先传到服务器,等到录音完成,只需要上传最后一个数据包,并告知服务器录音完成即可,基本上可以做到录完即传完,无需等待。

语音消息没有缩略图,因此语音下载基本就只能实打实的将原始文件下载下来。

 

以上就是网易云信对于Android 即时通讯开发的小结,欢迎各位积极提问,共同探讨。

 

以上是关于如何写一个即时通讯软件?的主要内容,如果未能解决你的问题,请参考以下文章

如何部署局域网即时通讯软件

分析内网即时通讯软件安全性如何

企业如何选择安全的即时通讯软件?

如何选择安全可靠的即时通讯软件

怎么选择企业即时通讯软件

如何开发一款即时通讯软件?看这六个项目就够了