Openfire简介

Openfire 是开源的、基于可拓展通讯和表示协议(XMPP)、采用Java编程语言开发的实时协作服务器。Openfire的效率很高,单台服务器可支持上万并发用户。

Server和Client端的通信都用xml文档的形式进行通信。

但是Openfire是Java语言写的,对于C#的dll拓展库相比与java的jar包少的可怜,在网上寻找一番之后找到了一个比较好的dll拓展库,agsxmpp是一个专门为C#连接xmpp协议下即时通讯已经搭建xmpp协议服务端的的dll,同时他有商业版MatriX,博主穷学生一个,没有啥钱去购买商业版,还是采用了普通的agsxmpp。

AgsXmpp简介

agsxmpp是AG—Software进行开发的一个开源项目,可以在它的官网进行下载源码。

agsxmpp是在2003年开始研发,2008年发布它的最后一个版本,因此它在兼容性上显然是不很好的。

同时在C#连接Openfire上,agsxmpp中有一个巨坑,加上网上关于agsxmpp的开发文档奇少,而且博主没有在官网上找到相关的开发文档(就算有也是全英文看不懂系列),故记下开发全过程。

因为agsxmpp并不是专门为Openfire制作的,而是对任何以xmpp协议的即时通讯进行连接等服务。如果不对源码进行一定的重写,在某些情况下会出现一些问题。

如果你直接使用 agsxmpp.dll 中 XmppClientConnection 类进行连接,就算你代码毫无错误,也无法正常连接Openfire,因为

博主只是对源码改了一句话,即可正常连接。

修改 protocol 中 sasl 下的 Mechanism.cs 中源码,将

case "DIGEST-MD5":

return MechanismType.DIGEST_MD5;

注释,因为 openfire 发送数据流 是通过 PLAIN 的 , 而 agsxmpp 是默认是 通过DIGEST-MD5 发送。

同时,在agsxmpp中,还有一个地方表现了对openfire的不兼容,openfire 发送iq节 不接收 to属性,因此还需要修改一个地方

源代码如下

public IQ SendIq(agsXMPP.protocol.client.IQ iq, int timeout)

{

synchronousResponse = null;

AutoResetEvent are = new AutoResetEvent(false);

SendIq(iq, new IqCB(SynchronousIqResult), are);

if (!are.WaitOne(timeout, true))

{

// Timed out

lock (m_grabbing)

{

if (m_grabbing.ContainsKey(iq.Id))

m_grabbing.Remove(iq.Id);

}

return null;

}

return synchronousResponse;

}

修改后如下

public void SendIq(IQ iq, IqCB cb, object cbArg)

{

// check if the callback is null, in case of wrong usage of this class

if (cb != null)

{

TrackerData td = new TrackerData();

td.cb = cb;

td.data = cbArg;

m_grabbing[iq.Id] = td;

//iq在agsxmpp中发送Iq节的时候先iq.RemoveAttribute("to")

iq.RemoveAttribute("to");

}

m_connection.Send(iq);

}

public void SendIq2(IQ iq, IqCB cb, object cbArg)

{

// check if the callback is null, in case of wrong usage of this class

if (cb != null)

{

TrackerData td = new TrackerData();

td.cb = cb;

td.data = cbArg;

m_grabbing[iq.Id] = td;

//iq在agsxmpp中发送Iq节的时候先iq.RemoveAttribute("to")

//iq.RemoveAttribute("to");

}

m_connection.Send(iq);

}

登录操作:发送xml消息用 SendIq() 方法

其他操作:发送xml消息用 SendIq2() 方法

连接上Openfire

官方提供了一个只有三行代码的小型Demo

XmppClientConnection xmpp = new XmppClientConnection(server);

xmpp.Open(username,secret);

xmpp.OnLogin+=delegate(object o){xmpp.Send(new Message(JID,MessageType.chat,msg));};

我的代码

public class XmppLogin

{

private XmppClientConnection xmppCon;

private bool isSSL;

///

/// 是否使用加密连接

///

public bool IsSSL { get { return isSSL; } set { isSSL = value; } }

private string userName;

private string server;

public string Server { get { return server; } set { server = value; } }

///

/// 用户名

///

public string UserName { get { return userName; } set { userName = value; } }

private string passWord;

///

/// 密码

///

public string PassWord { get { return passWord; } set { passWord = value; } }

private string clientVersion;

///

/// 客户端版本

///

public string ClientVersion { get { return clientVersion; }set { clientVersion = value; } }

///

/// 登录状态

///

public string LoginState { get { return xmppCon.XmppConnectionState.ToString(); } }

private int port;

///

/// 登录端口,通常是5222,加密时是5223

///

public int Port { get { return port; }set{ port = value;} }

public XmppLogin()

{

xmppCon = new XmppClientConnection();

}

#region 传递一个XmppClient对象

///

/// 传递一个XmppClient对象

///

/// 需要操作的具体实例

public XmppLogin(XmppClientConnection con)

{

xmppCon = new XmppClientConnection();

xmppCon = con;

}

#endregion

#region 登录

///

/// 登录openfire的方法

///

/// 返回值为是否登录

public void Login()

{

xmppCon.Server = server;

xmppCon.UseSSL = false;

xmppCon.Port = 5222;

xmppCon.AutoResolveConnectServer = true;

xmppCon.UseCompression = false;

xmppCon.EnableCapabilities = true;

xmppCon.ClientVersion = "1.0";

xmppCon.Capabilities.Node = "http://www.ag-software.de/miniclient/caps";

xmppCon.DiscoInfo.AddIdentity(new DiscoIdentity("pc", "MyClient", "client"));

xmppCon.DiscoInfo.AddFeature(new DiscoFeature(agsXMPP.Uri.DISCO_INFO));

xmppCon.DiscoInfo.AddFeature(new DiscoFeature(agsXMPP.Uri.DISCO_ITEMS));

xmppCon.DiscoInfo.AddFeature(new DiscoFeature(agsXMPP.Uri.MUC));

xmppCon.Open(userName,passWord);

//xmppCon.OnLogin += delegate (object o) { xmppCon.Send(new agsXMPP.protocol.client.Message("testa@118.89.48.159", MessageType.chat, "sdgo")); };

}

#endregion

#region 测试连接

///

/// 测试指定的OpenFire服务器和端口是否能连通

///

/// 返回是否能连通

public bool TestPing()

{

string ipAddress = Server;

int portNum = port;

bool CanConnect = false;

IPAddress ip = IPAddress.Parse(ipAddress);

try

{

IPEndPoint point = new IPEndPoint(ip, portNum);

using (Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))

{

sock.Connect(point);

CanConnect = sock.Connected;

sock.Close();

return CanConnect;

}

}

catch (SocketException e)

{

//LOG TODO

return false;

}

}

#endregion

public static implicit operator XmppClientConnection(XmppLogin v)

{

return v.xmppCon;

}

}

至此,Openfire连接成功。

最近忙而且也刚开始弄这个,过几天更新一下XmppConnection下各种属性、事件、函数的具体用法。

openfire java_C#连接基于Java开发IM——Openfire相关推荐

  1. C#连接基于Java开发IM——Openfire

    Openfire简介    Openfire 是开源的.基于可拓展通讯和表示协议(XMPP).采用Java编程语言开发的实时协作服务器.Openfire的效率很高,单台服务器可支持上万并发用户.    ...

  2. java电信计费项目论文_基于JAVA开发的电信IP计费系统设计毕业论文

    基于JAVA开发的电信IP计费系统设计毕业论文 本科毕业设计(论文)基于 JAVA 开发的电信 IP 计费系统毕业设计(论文)任务书学院:信息科学与工程学院 系级教学单位:电子与通信工程学号学生姓名专 ...

  3. 探果(简称tamguo)是基于java开发的在线题库系统

    简介: 探果(简称tamguo)是基于java开发的在线题库系统 启动 tms 找到tamguo-tms下面的application.propertys. domain.name // 页面引用静态资 ...

  4. B2C商城项目源码,基于Java开发的高可用分布式B2C商城系统,Java+Spring MVC+Dubbo+Zookeeper+MySQL+Redis+FastDFS+Nginx+Solr

    目录 前言 B2C商城-AIYOU 一.项目总体架构 二.系统软硬件设施总体规划 1.系统服务规划 2.应用服务规划 3.应用系统域名规划 三.系统运行环境构建 四.项目数据库创建 五.项目拉取 六. ...

  5. 精品基于java开发的航空订票系统SSM

    <基于java开发的航空订票系统>该项目含有源码.论文等资料.配套开发软件.软件安装教程.项目发布教程等 使用技术: 开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1. ...

  6. 基于Java开发的分布式在线教育系统,支持考试、直播、问答

    一.开源项目简介 知道学习平台是一个基于 Java 开发的分布式在线教育系统 项目采用前后端分离的企业级微服务架构 引入组件化的思想实现高内聚低耦合,项目代码简洁注释丰富上手容易 注重代码规范,严格控 ...

  7. 持续集成与持续部署(四)01-Jenkins——简介-基于Java开发的一种开源持续集成工具

    持续集成与持续部署(四)01-Jenkins--简介-基于Java开发的一种开源持续集成工具 Jenkins 使用简介 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控 ...

  8. 基于java开发的航空订票系统

    <基于java开发的航空订票系统>该项目含有源码.论文等资料.配套开发软件.软件安装教程.项目发布教程等 使用技术: 开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1. ...

  9. 祖玛java代码_androidzuma 基于java开发的安卓祖玛龙珠游戏代码,可帮助 的 学习。 Develop 238万源代码下载- www.pudn.com...

    文件名称: androidzuma下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 1174 KB 上传时间: 2013-11-27 下载次数: 1 提 供 者: ...

最新文章

  1. 80热敏打印机打印TxPrnMod.dll
  2. php删除指定符号,利用PHP删除特殊符号
  3. R语言使用anova函数进行方差分析比较两个回归分析模型的差异、从而决定是否删除某些预测变量(Comparing nested models using the anova function)
  4. Leetcode题库 145.二叉树的后序遍历(递归 C实现)
  5. Flume sink=avro rpc connection error
  6. java dos平台压缩_Dos命令 压缩 解压缩
  7. lammps软件_Lammps模型构建的方法之一:组合模型构建
  8. dp线长什么样子_HDMI、VGA、DVI、DP接口知识,史上最全面最通俗易懂对比分析!...
  9. 控件安全注册方法3选
  10. 只卖了2000辆,竟扬言吊打特斯拉!贾跃亭昔日偶像,还在忽悠?
  11. 超级全面的 Lombok 注解介绍,学一波!
  12. php 破解加密帖子,某PHP加密文件解密过程初探 · 浮萍’s Blog
  13. 前端提示框定位在鼠标的右下_前端基础高频面试题(更新中)
  14. Android 第三方应用接入微信平台(2)
  15. VTD的文件结构和Project建立的思路
  16. 海康摄像机、NVR、流媒体服务器、回放取流RTSP地址规则说明
  17. C# 阿里云视频点播
  18. Texlive安装失败解决方法
  19. 什么是主数据?什么是主数据管理系统?
  20. 何小鹏快跑:身家暴涨50亿美元,他还愿坐经济舱吗?

热门文章

  1. esxi虚拟山闪存修改
  2. linux测试x11,Linux GUI自动化测试工具x11 GUITest in Linux x86
  3. ListView刷新慢 注意点
  4. ssh出现公钥错误问题的解决方法
  5. Android调试技巧与常见问题解决方法汇总
  6. c语言自定义函数返回值的作用,C语言中return用法?
  7. 一款3D拼图游戏,看呆太多数学天才,被当作魔术表演
  8. 单例模式——饿汉模式懒汉模式
  9. 康熙“坐庄”——坐出纳兰的愁闷,雪芹的家破
  10. 修改IE默认网页源码查看器