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.dllXmppClientConnection 类进行连接,就算你代码毫无错误,也无法正常连接Openfire,因为

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

修改 protocolsasl 下的 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;
/// <summary>
/// 是否使用加密连接
/// </summary>
public bool IsSSL { get { return isSSL; } set { isSSL = value; } }
private string userName;
private string server;
public string Server { get { return server; } set { server = value; } }
/// <summary>
/// 用户名
/// </summary>
public string UserName { get { return userName; } set { userName = value; } }
private string passWord;
/// <summary>
/// 密码
/// </summary>
public string PassWord { get { return passWord; } set { passWord = value; } }
private string clientVersion;
/// <summary>
/// 客户端版本
/// </summary>
public string ClientVersion { get { return clientVersion; }set { clientVersion = value; } }
/// <summary>
/// 登录状态
/// </summary>
public string LoginState { get { return xmppCon.XmppConnectionState.ToString(); } }
private int port;
/// <summary>
/// 登录端口,通常是5222,加密时是5223
/// </summary>
public int Port { get { return port; }set{ port = value;} } public XmppLogin()
{
xmppCon = new XmppClientConnection();
} #region 传递一个XmppClient对象
/// <summary>
/// 传递一个XmppClient对象
/// </summary>
/// <param name="con">需要操作的具体实例</param>
public XmppLogin(XmppClientConnection con)
{
xmppCon = new XmppClientConnection();
xmppCon = con;
}
#endregion #region 登录
/// <summary>
/// 登录openfire的方法
/// </summary>
/// <returns>返回值为是否登录</returns>
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 测试连接
/// <summary>
/// 测试指定的OpenFire服务器和端口是否能连通
/// </summary>
/// <returns>返回是否能连通</returns>
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下各种属性、事件、函数的具体用法。

我的掘金:WarrenRyan

我的简书:WarrenRyan

欢迎关注我的博客获得第一时间更新 https://blog.tity.online

我的Github:StevenEco

我的博客园:WarrenRyan

C#连接基于Java开发IM——Openfire的更多相关文章

  1. 免费开源数字货币交易所——基于Java开发的比特币交易所 | BTC交易所 | ETH交易所 | 数字货币交易所

    本项目是基于Java开发的比特币交易所 | BTC交易所 | ETH交易所 | 数字货币交易所 | 交易平台 | 撮合交易引擎.本项目基于SpringCloud微服务开发,可用来搭建和二次开发数字货币 ...

  2. 基于java开发的在线题库系统tamguo

    简介 探果网(简称tamguo)是基于java开发的在线题库系统,包括 在线访问 后台运营 会员中心 书籍中心 管理员账号:system 密码:123456 因为线上数据和测试数据没有做到隔离,作者已 ...

  3. 基于java开发的开源代码GPS北斗位置服务监控平台

    最近在研究位置服务平台,基于全球卫星定位技术(GNSS).互联网技术.空间地理信息技术(GIS).3G/4G无线通信技术,面向全国公众用户建立大容量.实时.稳定的位置信息服务运营平台.实现管理目标的实 ...

  4. 基于java开发jsp+ssm+mysql实现的在线考试系统 源码下载

    实现的关于在线考试的功能有:用户前台:用户注册登录.查看考试信息.进行考试.查看考试成绩.查看历史考试记录.回顾已考试卷.修改密码.修改个人信息等,后台管理功能(脚手架功能不在这里列出),科目专业管理 ...

  5. 大众点评Java开发实时应用监控平台-CAT

    CAT介绍 CAT是基于Java开发的实时应用监控平台,包括实时应用监控,业务监控. CAT作为大众点评网基础监控组件,它已经在中间件框架(MVC框架,RPC框架,数据库框架,缓存框架等)中得到广泛应 ...

  6. HUDSON(Java开发的一种持续集成工具)

    Hudson是Jenkins的前身,是基于Java开发的一种持续集成工具,用于监控程序重复的工作,包括: 1.持续的软件版本发布/测试项目. 2.监控外部调用执行的工作. Hudson的特性 1.易于 ...

  7. Java开发小技巧(三):Maven多工程依赖项目

    前言 本篇文章基于Java开发小技巧(二):自定义Maven依赖中创建的父工程project-monitor实现,运用我们自定义的依赖包进行多工程依赖项目的开发. 下面以多可执行Jar包项目的开发为例 ...

  8. 纯 Java 开发 WebService 调用测试工具(wsCaller.jar)

    注:本文来自hacpai.com:Tanken的<纯 Java 开发 WebService 调用测试工具(wsCaller.jar)>的文章 基于 Java 开发的 WebService ...

  9. 初识Java以及JAVA开发环境搭建

    目录 JAVA帝国的诞生 C&C++ JAVA JAVA特性和优势 JAVA三大版本 JDK.JRE.JVE JAVA开发环境搭建 JDK下载与安装.卸载 安装JDK 卸载JDK JDK目录介 ...

随机推荐

  1. 大数据小视角2:ORCFile与Parquet,开源圈背后的生意

    上一篇文章聊了聊基于PAX的混合存储结构的RCFile,其实这里笔者还了解一些八卦,RCfile的主力团队都是来自中科院的童鞋在Facebook完成的,算是一个由华人主导的编码项目.但是RCfile仍 ...

  2. 【重学计算机】操作系统D5章:文件系统

    1. 文件系统 文件系统概述 文件的组织: 逻辑结构:流式.记录式 物理结构:顺序.连接.直接.索引 文件的存取:顺序.直接.索引 文件的控制:逻辑控制.物理控制 文件的使用:打开.关闭.读.写.控制 ...

  3. .net core webapi 前后端开发分离后的配置和部署

    背景:现在越来越多的企业都采用了在开发上前后端分离,前后端开发上的分离有很多种,那么今天,我来分享一下项目中得的前后端分离. B/S  Saas 项目:(这个项目可以理解成个人中心,当然不止这么点功能 ...

  4. 跟踪测试 DbContext ,向"不是真正的 ORM" 说拜拜

    FreeSql 发展到现在,已经有两种稳定的开发模式,以下先简单带过一下.后面才是本文的主题. 方法一:基于 helper 的方式,祼用: dotnet add package FreeSql 提供 ...

  5. .NETCore 基于 dbfirst 体验快速开发项目

    简介 今天出场是进化了多年的生成器工具,根据数据库结构(表.视图.存储过程.外键.各种类型.备注)快速生成一个项目,并自带后台管理系统.篇幅有限本文只讲解快速开发的使用过程,具体开发中的细节日后有空再 ...

  6. [JavaScript] AMD和CMD概述

    1. cmd 和 amd 在浏览器中,受网络和浏览器渲染的制约,不能采用同步加载,只能采用异步加载.于是 AMD 规范应运而生 2. AMD AMD(Asynchronous Module Defin ...

  7. 【译】在C#中实现单例模式

    目录 介绍 第一个版本 --不是线程安全的 第二个版本 -- 简单的线程安全 第三个版本 - 使用双重检查锁定尝试线程安全 第四个版本 - 不太懒,不使用锁且线程安全 第五版 - 完全懒惰的实例化 第 ...

  8. 使用CSS3的clip-path(裁剪路径)实现剪贴区域的显示以及实例实现图片渐变

    clip-path介绍 clip-path 直译过来就是裁剪路径,使用SVG或形状定义一个HTML元素的可见区域的方法.想象一下你在Photoshop中勾勒路径的场景.MDN上是这样介绍 clip-p ...

  9. Android studio无法创建类和接口问题解决办法。提示 Unable to parse template "Class"

    重新配置了studio 的工作环境, 没问题,后来加需求要新增java类和接口,这就出现问题了,新建的时候,就会报错: Unable to parse template "Interface ...

  10. 有关Windows10中诊断和反馈隐私设置

    当你使用 Windows 时,我们将收集诊断信息,为了确保能收到你(我们的客户)的反馈,我们为你提供了多种方式,以便你可以随时发送反馈,也可以在某个特定的时间(例如当 Windows 10 向你提出关 ...