agsXMPP分析:agsXMPP简要指南 (转)

agsxmpp agsXMPP使用agsXMPP中的例子已经有注册、登录、添加好友、接收好友添加请求、发送消息、接收消息等功能。修改用户密码登录后可用以下方法修改密码IQ iq = new IQ(IqType.set); Register riq = new Register(); riq.Username = "Username"; riq.Password = "Password"; iq.Query = ri 阅读详情

agsXMPP致力于创建一个轻量、快速的跨平台类库,用于XMPP协议。

通过下面的三项技术,agsXMPP达到了这个目标。

  1. 异步套接字
  2. 与工厂模式结合的快速XML解析器
  3. 自有的轻量级XML Dom,作为所有agsXMPP协议类的基础

我们为什么不直接所用Microsoft的System.Xml命名空间里的类呢?

因为我们决定创建自己的轻量级的Xml Dom,能够飞快地运作,特别是在像PPC's和Smartphones这样的嵌入式设备上。

XmlTextReader有利于SAX-like的解析。但是Microsoft在.NET1.1的SP1中做了下改变,这使得我们不能够再使用它来解析网络流。所以我们需要另外的XML解析器。

类库的惊人之处在哪?

一旦从套接字接收到数据,该数据便由sax-like XML解析器解析。此解析器使用工厂模式来创建agsXMPP协议类相关的元素。

示例:

套接字接收到一条信息,将比特流推送至解析器。XML解析器探测到隶属于jabber:client命名空间中名字为message的开标签符。在元素创建前,解析器在工厂散列表中做个查找。这样就创建了agsXMPP.protocol.client.Message类的一个实例。如果表中不存在name/namespace的绑定,则会创建agsXMPP.Xml.Element的一个实例。

所有的XMPP协议类都派生自agsXMPP.Xml.Element。他们都是在内存中保持XML树的'abstract'元素。所有的属性都是'realtime properties'。在我们要读取消息体,调用消息体属性时,类将会实时查找<body/>元素。

Creating your own packet types

下面的小例子中我们将要创建一个我们自己的扩展,通过XMPP网络发送天气信息。最简单的方法是将天气的数据信息嵌入到一个message节中。嵌入了天气信息的新XML message如下所示:

< message xmlns = " jabber:client "  to = " romeo@montage.net " >
    
< weather xmlns = " agsoftware:weather " >
        
< humidity > 90 </ humidity >
        
< temperature > 57 </ temperature >
    
</ weather >
</ message >

我们要给这个新的协议创建一个新的命名空间和3个新元素:weather、humidity和temperature

首先,我们给我们定制的XML元素创建一个新的类weather.cs,派生自agsXMPP.Xml.Dom.Element。

using  System;
using  agsXMPP.Xml.Dom;

namespace  MiniClient
{
    
public class Weather : Element
    
{
        
public Weather()
        
{
            
this.TagName = "weather";
            
this.Namespace = "agsoftware:weather";
        }

        
public Weather(int humidity, int temperature) : this()
        
{
            
this.Humidity = humidity;
            
this.Temperature = temperature;
        }

        
public int Humidity
        
{
            
get { return GetTagInt("humidity"); }
            
set { SetTag("humidity", value.ToString()); }
        }

        
public int Temperature
        
{
            
get { return GetTagInt("temperature"); }
            
set { SetTag("temperature", value.ToString()); }
        }

    }

}

然后在元素工厂中注册这个新类。如果不注册,在解析XML流时XML解析器就不会weather对象。我们通过下面的代码注册该类:

agsXMPP.Factory.ElementFactory.AddElementType( " weather " ,
" agsoftware:weather " ,  typeof (Weather));

我们在使用agsXMPP处理其它事件时,应该先注册我们自己的元素。

现在我们能够创建自己的weather message,然后发送:

Weather weather  =   new  Weather( 90 ,  57 );
Jid to 
=   new  Jid( " romeo@montage.net " );
Message msg 
=   new  Message();
msg.To 
=  to;
//  Add our weather Element
msg.AddChild(weather);
//  Send the message
XmppCon.Send(msg);

接收此message的另一个应用程序可以像OnMessage handler那样访问到我们的定制数据:

private   void  XmppCon_OnMessage( object  sender, Message msg)
{
    
if  (msg.HasTag( typeof (Weather)))
    {
        Weather weather 
=  msg.SelectSingleElement( typeof (Weather))  as  Weather;
        Console.WriteLine(weather.Temperature.ToString());
        Console.WriteLine(weather.Humidity.ToString());
    }
}

现在我们创建了我们第一个自己的(信息)包,包含了一个message节。接下去我们要创建基于Iqs的小型weather service。

service的raw xml protocol:

Romeo向weather service请求了他城市的天气信息,zip code为'74080':

< iq from =' romeo@montagne.net' to =' weather.mortagne.net' type =' get' id =' agsXMPP_1' >
    
< query xmlns =' agsoftware:weather' >
        
< zip > 74080 </ zip >
    
</ query >
</ iq >

接着weather service查找该zip code的天气数据,然后返回结果给Romeo:

< iq to =' romeo@montagne.net' from =' weather.mortagne.net' type =' result' id =' agsXMPP_1' >
    
< query xmlns =' agsoftware:weather' >
        
< humidity > 90 </ humidity  >
        
< temperature > 57 </ temperature >
        
< zip > 74080 </ zip >
    
</ query >
</ iq >

Weather.cs的源代码:

using  System;
using  agsXMPP.Xml;
using  agsXMPP.Xml.Dom;

public   class  Weather : Element
{
    
public Weather()
    
{
        
this.TagName = "query";
        
this.Namespace = "agsoftware:weather";
    }

    
public int Humidity
    
{
        
get { return GetTagInt("humidity"); }
        
set { SetTag("humidity", value.ToString()); }
    }

    
public int Temperature
    
{
        
get { return GetTagInt("temperature"); }
        
set { SetTag("temperature", value.ToString()); }
    }

    
public int Zip
    
{
        
get { return GetTagInt("zip"); }
        
set { SetTag("zip", value.ToString()); }
    }

}

WeatherIq.cs的源代码:

using  System;
using  agsXMPP;
using  agsXMPP.protocol.client;

public   class  WeatherIq : IQ
{
    
private Weather m_Weather = new Weather();

    
public WeatherIq()
    
{
        
base.Query = m_Weather;
        
this.GenerateId();
    }


    
public WeatherIq(IqType type)
        : 
this()
    
{
        
this.Type = type;
    }


    
public WeatherIq(IqType type, Jid to)
        : 
this(type)
    
{
        
this.To = to;
    }


    
public WeatherIq(IqType type, Jid to, Jid from)
        : 
this(type, to)
    
{
        
this.From = from;
    }


    
public new Weather Query
    
{
        
get
        
{
            
return m_Weather;
        }

    }

}

当然我们要在工厂里注册Weather对象,使用下面代码:

agsXMPP.Factory.ElementFactory.AddElementType( " weather " ,
" agsoftware:weather " ,  typeof (Weather));

Romeo的客户端使用WeatherIq对象创建了请求Iq包:

WeatherIq wIq  =   new  WeatherIq(IqType. get );
wIq.To 
=   new  Jid( " weather.mortagne.net " );
wIq.From 
=   new  Jid( " romeo@montagne.net " );
wIq.Query.zip 
=   74080 ;
//  Send the message
XmppCon.Send(wIq);

weather service在Iq handler中接收此请求,然后把响应发回给Romeo。在weather service中获得请求信息,然后编辑:

private   void  XmppCon_OnIq( object  sender, agsXMPP.Xml.Dom.Node e)
{
    IQ iq 
= e as IQ;
    Element query 
= iq.Query;

    
if (query != null)
    
{
        
if (query.GetType() == typeof(Weather))
        
{
            
// its a Weather IQ
            Weather weather = query as Weather;
            
if (iq.Type == IqType.get)
            
{
                Console.WriteLine(weather.Zip.ToString());
                
// read the zip code and lookup the weather
                
// data for this zip code
                
// . . . .
                iq.SwitchDirection();
                iq.Type 
= IqType.result;
                weather.Humidity 
= 90;
                weather.Temperature 
= 57;
                
// Send the result back to romeo
                XmppCon.Send(iq);
            }

        }

    }

}

Romeo接收到响应,然后通过我们的weather对象的属性访问到天气数据。

http://www.cnblogs.com/HappyQQ/archive/2008/01/13/1036646.html

XMPP协议--即时通讯工具实现原理 agsXMPP\XMPP协议--即时通讯工具实现原理 立即下载

相关推荐

agsXMPP.dll

c#开发即时聊天工具使用agsXMPP时必须用到的一个DLL文件

agsxmpp c mysql_agsXMPP + Openfore 即时通讯开发(一)【agsXMPP 连接 Openfire】

需要准备的资源:1、Openfire2、agsXMPP (因为我一直在做NET开发,所以agsXMPP方便一些)Start:1、环境搭建 Openfire 安装 (文章一搜一大堆,就不在这里废话了)2、agsXMPP 链接 Openfire (我照着链接的文章中的方法修改agsXMPP的MiniClient,最后连接成功了)文章中有一个地方需要注意2.修改 agsxmpp IqGrabber.cs...

weixin_32445895的博客 229

agsXMPP类库(C#)

这是一个agsXMPP.dll类库(C#),查看了许多人都是在网上下源码,然后编译出现各种问题,小弟特别拿出来分享一下。

XMPP即时通讯协议

XMPP即时通讯协议 XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM(IM:instant messaging,即时消息)协议之一,其他三种分别为:即时信息和空间协议(IMPP)、空间和即时信息协议(PRIM)、针对即时通讯和空间平衡扩充的进程开始协议SIP(SIMPLE)。 XMPP的前身是Jabbe...

NcepuKZH的博客 2977

agsXMPP 开源IM全套代码

最新agsXMPP全套代码,更新时间:2016.5.7, 开源的IM框架,目的是简化客户端的工作,将主要任务集中在服务端统一处理。

C# agsXmpp连接Openfire的Demo。可登陆接收发送消息

即时通讯Im Demo,用openfire做服务器,C#agsXmpp做客户端连接实现即时通讯。只实现登陆,接收发送消息。

agsXMPP Software Design

原文:http://www.cnblogs.com/hunts/archive/2006/12/11/588912.htmlagsXMPP致力于创建一个轻量、快速的跨平台类库,用于XMPP协议。 通过下面的三项技术,agsXMPP达到了这个目标。 异步套接字 与工厂模式结合的快速XML解析器 自有的轻量级XML Dom,作为所有agsXMPP协议类的

蜗牛档案室 2565

agsXMPP即时消息系统C#版 源码

基于agsXMPP的c# 开发即时消息系统 直接可用。代码清析。服务器客户端都有。全是源码。学习agsXMPP的最好用实例,喜欢拿去。

agsxmpp c mysql_agsXMPP分析:agsXMPP简要指南 (转)

如果您还不知道agsXMPP是什么,您可以先阅读我的这篇随笔:Jabber Software:Jabber-NET、agsXMPP与WilefireagsXMPP SoftwareDesignagsXMPP致力于创建一个轻量、快速的跨平台类库,用于XMPP协议。通过下面的三项技术,agsXMPP达到了这个目标。异步套接字与工厂模式结合的快速XML解析器自有的轻量级XML Dom,作为所有agsX...

weixin_29817791的博客 208

【项目实战】基于STM32单片机的智能小车设计(有代码)

【1】背景意义 近些年随着国民生活水平的提升,以小车为载体的轮式机器人进入了我们的生活,尤其是在一些布线复杂困难的安全生活区和需要监控的施工作业场合都必须依赖轮式机器人的视频监控技术。因此,基于嵌入式技术的无线通信视频监控轮式机器人应运而生。由于它们与人类工作相比具有成本低廉、安全稳定的优点,目前已经在许多危险作业以及工业场合得到了广泛应用而且轮式机器人不需要像人那样采取过多的保护措施,因此轮式机...

ShawnWang1994的博客 13万+

中移物联ML307C模组OPENCPU笔记2

本文介绍了如何编译和运行一个DEMO程序,以官方SDK为例。

weixin_43700831的博客 1883

agsxmpp client 连接openfire

agsxmpp 连接openfire  需修改源代码如下: 1. 修改 agsxmpp 里的Mechanism.cs 里                        //case "DIGEST-MD5": //注释掉  case "DIGEST-MD5": 使plain 变为   默认设置                     //return Mechanism

zhleiyang的专栏 5203

EV1527、PT2262傻傻分不清?一文讲透常见315/433MHz遥控编码协议区别与选型

本文深度对比了EV1527、PT2262和SC5262三种常见的315/433MHz遥控编码协议,详细解析了它们的技术特点、成本效益和适用场景。EV1527作为低成本方案的首选,特别适合智能家居和简易安防设备;PT2262在稳定性和兼容性上表现优异;而SC5262则在安全性方面具有显著优势。文章还提供了实用的选型框架和工程建议,帮助开发者在不同应用场景中做出最优决策。

weixin_33640562的博客 349

Jabber Software:Jabber-NET、agsXMPP与Wilefire

原文:http://jiaoyu.gjjblog.com/ReadUrl.php?id=569681本篇介绍两个使用.NET技术,确切的说是使用C#写的Jabber Code Libraries – Jabber.NET、agsXMPP,以及一个Java写的跨平台Jabber Server – Wilefire。前言:即将完成Jabber Protocal(XMPP) : Core

蜗牛档案室 2514

PaddleOCR GPU部署:从环境配置到避坑实战指南

本文详细介绍了PaddleOCR GPU部署的全过程,从环境配置到避坑实战指南。通过分析常见的部署失败原因,提供硬件兼容性自查、软件环境精配方案以及路径配置的解决方案,帮助用户高效完成GPU加速的OCR任务部署,避免90%的常见错误。

weixin_30839881的博客 418

统信UOS服务器上,达梦DM8数据库安装避坑全记录(附大小写敏感设置)

本文详细介绍了在统信UOS服务器版上部署达梦DM8数据库的全过程,包括环境准备、安装流程、数据库实例初始化及关键参数配置,特别是大小写敏感设置的注意事项。提供了从系统配置到性能优化的完整指南,帮助用户避免常见问题,确保数据库稳定运行。

weixin_30647423的博客 332

agsxmpp 和 openfire 服务器 通信

如题, 一直做c#, 最近做openfire 开发,所以我选择 agsxmpp 做测试的客户端,以下是遇到的问题及解决方法 1. openfire发送数据流是通过 PLAIN 的 , 而 agsxmpp 是默认是 通过DIGEST-MD5 发送 2. openfire 发送iq节不接收 to属性 集体解决方案 1. 修改 agsxmpp 里的Mechanism.cs 里 //case "DIGEST-MD5": //我加的 注释掉case "DI...

翻肚鱼儿的博客 232

手把手入门YOLO到改进优化教程 | 【P2基础篇】数据标注+环境搭建+模型训练

本节以 YOLO自定义目标检测训练为主线,带你从零开始完成 数据标注 → 环境搭建 → 模型训练 → 结果的流程。使用labelImg制作符合YOLO格式的自定义数据集。在Windows基于 Python + Conda 创建独立虚拟环境,安装 PyTorch + CUDA + ultralytics,配置 PyCharm 运行环境。本节不仅使用自定义数据集进行演示,同时也用公开数据集训练 YOLO,查看训练日志与可视化结果(PR、P/R/F1 曲线等)等。

嵌入式阿齐Archie 2万+

agsXMPP使用

agsXMPP库提供了XMPP协议的基础功能实现,包括注册、登录、好友管理和消息收发。本文重点介绍了如何使用agsXMPP修改用户密码,通过创建IQ对象并设置Register查询参数来实现密码修改,生成的XML格式为标准的XMPP注册查询请求。文中还提供了一个完整的IM程序示例下载链接,包含上述功能的实现代码。

赤龙绕月的专栏 815

FFMPEG音视频开发: Linux下采集音频(alsa-lib库)、视频(V4L2框架)数据编码并实时推流到RTMP流媒体服务器,达到直播功能(推流)

一、环境介绍 操作系统: VM虚拟机运行的ubuntu18.04 FFMPEG版本: 4.4.2 摄像头: 罗技USB摄像头、电脑自带摄像头 声卡:电脑自带声卡 二、FFMPEG、X264的安装 参考这里:FFMPEG开发: Linux下采集摄像头数据录制成MP4视频保存到本: 地https://blog.youkuaiyun.com/xiaolong1126626497/article/d...

2990

【人工智能】架构演进:基于本体论与 LLM Agent 的供应链备件决策闭环实践

本文探讨了如何将本体论(Ontology)与大语言模型(LLM)Agent结合,构建供应链备件管理的智能决策系统。针对LLM在垂直领域存在的幻觉和逻辑缺陷问题,提出通过本体论建立结构化知识框架,形成四层架构:知识建模、动态感知、深度分析和决策闭环。系统利用图数据库实例化领域本体,融合多源数据实现实时感知,结合图谱推理和时序预测进行确定性分析,最终通过工具调用完成决策执行。技术选型推荐Gemini 1.5 Pro、Neo4j和LangChain等工具,实现从自动化到智能化的升级。该架构为工业领域提供了可解释、

奶爸的编程之路,也就一周冷个三天 170

agsxmpp c mysql_agsxmpp 和 openfire 服务器 通信

如题, 一直做c#, 最近做openfire 开发,所以我选择 agsxmpp 做测试的客户端,以下是遇到的问题及解决方法1. openfire发送数据流是通过 PLAIN 的 , 而 agsxmpp 是默认是 通过DIGEST-MD5 发送2. openfire 发送iq节不接收 to属性集体解决方案1. 修改 agsxmpp 里的Mechanism.cs 里//case "DIGE...

weixin_30402231的博客 169

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

创建基于agsXMPP的实例

agsXMPP致力于创建一个轻量、快速的跨平台类库,用于XMPP协议。 通过下面的三项技术,agsXMPP达到了这个目标。 异步套接字 与工厂模式结合的快速XML解析器 自有的轻量级XML Dom,作为所有agsXMPP协议类的基础 我们为什么不直接所用Microsoft的System.Xml命名空间里的类呢?因为我们决定创建自己的轻量级的Xml Dom,能够飞快地

Glacial Zone 908

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

agsXMPP的了解

<br />agsXMPP的定义:agsXMPP致力于创建一个轻量、快速的跨平台类库,用于XMPP协议。<br />本篇简要介绍了agsXMPP类库的agsXMPP命名空间下的类。<br />该命名空间下有以下几个类:<br />Icon<br />Type<br />DescriptionId<br />用于输出唯一的Message Id <br />IqGrabberJid<br />用于创建及处理XMPP Id <br />MessageGrabber<br />PacketGrabber<br />

chenhaibin415的专栏 1007

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

agsxmpp c mysql_XMPP(2)agsXMPP实现细节浅析

using System; using System.IO; using System.Text; using System.Threading; using System.Net; using System.Net.Sockets; using agsXMPP.protocol; using agsXMPP.protocol.iq; using agsXMPP.protocol.iq.auth;...

weixin_39692172的博客 117
上一篇: 创建基于agsXMPP的实例
下一篇: c#调用Win32 Api函数
backall
博客等级 码龄21年 2粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值