最近在移动端开发中遇到推送消息、即时通信的需求,以前没有注意过这方面的知识,特别花费一段时间捣鼓了一下,初步实现了c#访问openfire服务器,实现即时通信。特此记录一下,方便与我一般的初涉者参考。
首先,即时通信服务分为服务端与客户端两块。
一、服务端
服务端使用openfire直接进行搭建,基本上是一步步向下操作即可。
我使用的是exe版本的安装程序,首先正常安装,然后启动服务器端,进入其web的管理台,进行一些初始化的设置。中间主要需要设置数据库访问,注意官方自带的JDBC类型并不完整,比如我使用的是oracle,则需要自己下载相应数据库版本的JDBC,将包放到openfire安装目录下的lib文件夹中。
测试:服务端设置成功以后,可以安装直接的Spark客户端进行测试(常规的即时通信工具)。
openfire和Spark下载地址:http://www.igniterealtime.org/downloads/index.jsp
二、客户端
因为openfire是JAVA项目,我们这些C#选手想要使用须通过agsXMPP进行访问。
在使用agsXMPP访问openfire服务器时需要注意以下问题。
1. 认证协议问题
agsXMPP 在认证的时候,默认使用 DIGEST-MD5 ,但是在 openfire 下无法认证通过,改成 PLAIN 即可,也就是在 miniclient 的 frmMain.cs 的 XmppCon_OnSaslStart 方法中,将如下两行的注释去掉:
args.Auto = false;
args.Mechanism = agsXMPP.protocol.sasl.Mechanism.GetMechanismName(agsXMPP.protocol.sasl.MechanismType.PLAIN);
2. Iq 节
Openfire 不支持 Iq 节带 to 的属性,所以在 agsXMPP 中发送 Iq 节的时候先 RemoveAttribute("to") 一下就行了,具体的就是找到 agsXMPP 源代码目录下的 sasl/saslHandler.cs 文件中,所有调用 SendIq 方法的前面,都加入如下语句:
bIq.RemoveAttribute("to");