在即时通信这个领域目前只找到一个XMPP协议,在其协议基础上还是有许多成熟的产品,而且是开源的。所以还是想在这个领域多多了解一下。

XMPP协议:具体的概念我就不写了,毕竟这东西网上到处是。简单的说就是基于XML的一种协议。其解决了什么问题呢?就是给即时通讯制定了标准,大家只要遵守标准就可以完成即时通信的功能。有了标准的好处就是可以有各种不同的实现,大家在这个标准上发展自己的特长。而且还给即时通信提供了互联互通的基础。XMPP协议据网上说还是比较优秀的,表现就是google等大公司都在自己的即时通讯产品上。

openfire:是我在这个万花丛中找到的一点红。选它的主要原因是:

1、它支持XMPP咯

2、它是java实现的,开源的

3、它比较有名,性能不错

4、部署挺简单的,还有许多现成的插件

至于openfire的安装部署网上文章比较多,这里也不打算写。可以到这个网站上找到比较多的资源:http://www.igniterealtime.org/

为什么说openfire部署简单,我当时只是下载了一个exe的安装包,然后在windows下按照向导安装部署配置后,再整个客户端就可以聊天了。而且在igniterealtime上有配套的客户端产品,还有类库提供。对于开发者来说很方便,而且很实用。

然而我花了较多时间研究的并不是服务端,毕竟这部分还没到实际的产品开发,只要能跑即可。所以时间都花在哪了呢?就是客户端,毕竟spark这个客户端的界面有点老久,而且聊天功能完成的也比较原始。所以就得花比较多的时间在这上面。

另外,实际的需求对客户的要求是可以适用多平台:windows,macos,android,ios,甚至还要能在浏览器中。毕竟之前没有做过即时通讯的产品,这一下子还真有点拿不到点。于是只好一个个去接触了解。经过了解真正能拿来商用的东西不多,只能自己去定制开发。这里有个XMPP的官方网站可以看看:http://xmpp.org/software,这里列举了一些现有的产品和开发包。包括Clients,Servers,Libraries,Projects。openfire就在Servers中可以找到,spark在Clients可以找到,Smack在Libraries中找到。其中的Projects列举了一些使用XMPP协议的比较大的项目,比如Google、whatapp、apple,够大了吧。

我的想法是围绕igniterealtime来展开吧,毕竟是个持续维护的产品系列。

1、spark可以使用在多平台上,这样PC端的算是解决了

2、smack包可以支持android平台,可以在这个包基础上定制开发android的产品

spark的功能还是比较完整的,文本、图片、文件消息都支持,单聊、群聊也支持。只要在界面上做些定制便可以用于使用了。而且spark的通讯核心还是smack,这也充分说明了smack的重要性。smack新版本已经支持android,为此我就直接写了一个smack的android版本的demo,这样一方面了解一下smack,同时也了解一下android的开发。

源代码已经放在github上:https://github.com/mini188/SmackDemo

完成的非常搓,也就是个登录、简单聊天。

简单的写了一个单例的类:XmppConnectionService,主要是负责与Xmpp服务器的通讯管理,这里面最主要的就是建一个连接,由于smack(4.1.x)的版本更新后和之前老的api不一样了。所以在我在网上看到很多资料都是比较老的写法,试了一段时间都是失败。后来找到方法:

    public void Connect (String userName, String pwd){
if (_xmppConnection != null && _xmppConnection.isConnected()) {
return;
} XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
configBuilder.setHost("192.168.45.41");
configBuilder.setPort(5222);
configBuilder.setUsernameAndPassword(userName, pwd);
configBuilder.setServiceName("zrtc");
configBuilder.setCustomSSLContext(getSslContent());
//configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled); _xmppConnection = new XMPPTCPConnection(configBuilder.build());
new Thread() {
@Override
public void run() {
try {
_xmppConnection.connect();
_xmppConnection.login();
} catch (IOException e) {
Log.e("XMPP_CONNLOGIN", e.getMessage());
} catch (XMPPException e) {
Log.e("XMPP_CONNLOGIN", e.getMessage());
} catch (SmackException e) {
Log.e("XMPP_CONNLOGIN", e.getMessage());
}
}
}.start();
}

这段代码里主要是两点注意:

1、服务器通讯要用自定义证书的话要用自定义的SSLConent,说白点就是不验证证书是否可信。这玩意不知道使用有CA签名的证书会不会有这问题。

2、connect要使用线程来执行,这是由于android中不允许在主线程中跑这种耗时的代码,影响界面响应

获取登录用户的好友列表:

 Roster roster = Roster.getInstanceFor(_conn);
Set<RosterEntry> entries = roster.getEntries();

创建聊天会话:

    private void createChat(Intent intent) {
_jid = intent.getStringExtra(JID);
_chat = _chatMgr.createChat(_jid); _chat.addMessageListener(new ChatMessageListener() {
@Override
public void processMessage(Chat chat, Message message) {
addMessage(message);
}
});
}

会话还可以监听消息,这样对方发来消息就可以进行处理。比如显示在聊天记录里。

发送聊天信息:

        _sendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText sendText = (EditText) findViewById(R.id.textinput);
String msg = sendText.getText().toString();
if (!msg.equals("")) {
Message message = new Message();
message.setTo(_jid);
message.setBody(msg);
message.setType(Message.Type.chat);
addMessage(message);
try {
_chat.sendMessage(message);
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
}
sendText.setText("");
}
}
});

还是通过会话_chat,它有一个方法sendMessage就可以将消息发送出去,挺简单的吧。

最后贴一下聊天的效果吧,真的好搓:

最后备注一下,这个android的客户端demo代码参考了一个开源项目:https://github.com/siacs/Conversations

技术笔记:XMPP之openfire+spark+smack的更多相关文章

  1. openfire+spark+smack实现即时通讯

    近公司项目需要用到即时通讯功能,经过调研发现openfire+spark+smack可以实现.在网上找了很久,资料都十分有限,即使有些朋友实现了也说的不清不楚.于是决定自己研究,耗时一周的时间实现了文 ...

  2. 即时通讯软件openfire+spark+smack

    所以我基本上分为三篇文章来介绍此类软件的开发: 第一篇是关于XMPP 协议是啥,IM 是啥以及一个比较有名的开源实现,该开源实现包括三个部分(Spark.Smack和Openfire): 第二篇讲如何 ...

  3. Android XMPP 例子(Openfire+asmack+spark) 出现登陆连接错误

    Android XMPP 例子(Openfire+asmack+spark) 运行出来没问题,但是登陆的时候出现如下错误: 出现错误: 09-17 15:24:16.388: E/AndroidRun ...

  4. iOS xmpp Openfire+spark环境搭建

    配置这个遇到太多问题了,写下来分享 首先到官网下载openfire+spark 下载地址:http://www.igniterealtime.org/downloads/index.jsp

  5. openfire/spark/asmack 环境调试纪要

    项目需要简单搭建openfire/spark/asmack的环境及程序demo,本文简单记录以免遗忘. 1.openfire/spark 是java编写的xmpp服务器及PC客户端,安装过程相当简单一 ...

  6. openfire spark 二次 开发 服务插件

    ====================  废话 begin   ============================ 最近老大让我为研发平台增加即时通讯功能.告诉我用comet 在web端实现即 ...

  7. 技术笔记:Indy的TIdSMTP改造,解决发送Html和主题截断问题

    使用Indy来发邮件坑不少啊,只不过有比没有好吧,使用delphi6这种老工具没办法,只能使用了新一点的Indy版本9,公司限制... 1.邮件包含TIdText和TIdAttachment时会出现T ...

  8. PHP实现日志处理类库 - 【微信开发之微电商网站】技术笔记之二

    继上篇文章[微信开发之微电商网站]技术笔记之一,昨日做了日志处理的功能. 对于现在的应用程序来说,日志的重要性是不言而喻的.很难想象没有任何日志记录功能的应用程序运行在生产环境中.日志所能提供的功能是 ...

  9. xmpp和OpenFire示例,即时聊天室,支持离线消息

    让我说说为什么写这个博客,这是因为我在上周末的研究XMPP和OpenFire,从互联网上下载Demo,但跑不起来.它花了很长的时间.它被改造.抬高.篇博文也是希望后边学习XMPP和OpenFire的同 ...

随机推荐

  1. 采用MiniProfiler监控EF与.NET MVC项目(Entity Framework 延伸系列1)

    前言 Entity Framework 延伸系列目录 今天来说说EF与MVC项目的性能检测和监控 首先,先介绍一下今天我们使用的工具吧. MiniProfiler~ 这个东西的介绍如下: MVC Mi ...

  2. .NET 基础 一步步 一幕幕[面向对象之构造函数、析构函数]

    构造函数.析构函数 构造函数: 语法: //无参的构造函数 [访问修饰符] 函数名() :函数名必须与类名相同. //有参的构造函数 [访问修饰符] 函数名(参数列表):函数名必须与类名相同. 作用: ...

  3. C# 正则表达式大全

    文章导读 正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串.正则表达式无疑是处理文本最有力的工具,而.NET提供的Regex类实现了验证正则表达式的方法.Regex 类表示不可变(只读)的 ...

  4. windows+nginx+iis+redis+Task.MainForm构建分布式架构 之 (nginx+iis构建服务集群)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...

  5. 【原创】免费申请SSL证书【用于HTTPS,即是把网站从HTTP改为HTTPS,加密传输数据,保护敏感数据】

    今天公司有个网站需要改用https访问,所以就用到SSL证书.由于沃通(以前我是在这里申请的)暂停了免费的SSL证书之后,其网站推荐了新的一个网站来申请证书,所以,今天因为刚好又要申请一个证书,所以, ...

  6. 【干货分享】流程DEMO-外出申请

    流程名: 外出申请  流程相关文件: 流程包.xml  流程说明: 直接导入流程包文件,即可使用本流程  表单:   流程: 图片:2.png DEMO包下载: http://files.cnblog ...

  7. JDK安装与配置

    JDK安装与配置 一.下载 JDK是ORACLE提供免费下载使用的,官网地址:https://www.oracle.com/index.html 一般选择Java SE版本即可,企业版的选择Java ...

  8. TFS2013 设置签出独占锁

    转载自: http://www.cnblogs.com/zhang888/p/4280251.html

  9. 利用PowerShell复制SQLServer账户的所有权限

    问题 对于DBA或者其他运维人员来说授权一个账户的相同权限给另一个账户是一个很普通的任务.但是随着服务器.数据库.应用.使用人员地增加就变得很枯燥乏味又耗时费力的工作.那么有什么容易的办法来实现这个任 ...

  10. 如何开启MySQL 5.7.12 的二进制日志

    1. 打开/etc下的my.cnf文件 2. 编辑它,添加内容: log_bin=binary-log   #二进制日志的文件名 server_id=1  #必须指定server_id,这是MySQL ...