• 基于WPF+XMPP的IM程序开发日志 之三:用户头像Avatar


    在XMPP中对用户头像的支持定义在两个扩展协议中:

    EXP-0153:基于电子名片的头像

    EXP-0084:用户头像

    好像还有一个扩展协议用于头像,但忘记了是什么了,ags的官网论坛突然间访问不了。但EXP-0084好像支持不是很广泛,agsXMPP支持了,但是Openfire不支持,我在agsXMPP中新建了一个AvatarIq,发送后,得到Openfire的回应IQ错误是Service-Unavailable,代码片段:AvatarIq avatarIq = new AvatarIq();

    avatarIq.Type = IqType.get;
    avatarIq.To = "test@mypc";
    avatarIq.From = "test2@mypc";
    avatarIq.Id = "avatar_id_001";

    _xmppConn.Send(avatarIq)

     得到的回应IQ为:
    <iq xmlns="jabber:client" from="test@mypc" to="test@mypc" type="error" id="avatar_id_001"><query xmlns="jabber:iq:avatar" /><error code="503" type="cancel"><service-unavailable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" /></error></iq>

      而且好像ags的论坛的ALEX也说最好使用EXP-0153的avatar方式。

    于是改成使用 :

    agsXMPP.protocol.iq.vcard.VcardIq viq = new agsXMPP.protocol.iq.vcard.VcardIq();
    viq.To = new Jid("test2@mypc");
    viq.From = new Jid("test@mypc");
    viq.Id = "id_00010";
    viq.Type = IqType.get;

    _xmppConn.Send(viq); 

    果然返回的就是一个Vcard的IQ。这里根据XEP-0153定义的,Photo中间的BINVAL节就是用户头像的base64编码内容,解码出来就是用户头像,或者Photo.Image本身就是一个System.Drawing.Imaging.Image对象。

    另外,由于对XMPP不是很熟练,在使用IQ的时候, 发送了IQ,但却没有触发xmppClientConnection对象的OnIq事件,后来查看RFC3920协议关于IQ的描述部分,发现自己没有设置ID和type:

    为了强制执行这些语义学,要应用以下规则:
    1. 对于IQ节来说'id'属性是必需的(REQUIRED).
    2. 对于IQ节来说'type'属性是必需的(REQUIRED). 它的值必须(MUST)是以下之一: 
    get -- 这个节是一个对信息或需求的请求.
    set -- 这个节提供需要的数据, 设置新的值, 或取代现有的值.
    result -- 这个节是一个对一个成功的 get 或 set 请求的应答.
    error -- 发生了一个错误,关于处理或递送上次发送的 get 或 set的(参见 节错误 Stanza Errors(第九章第三节)).
    3. 一个接收到"get" 或 "set" 类型的IQ请求的实体必须(MUST)回复一个"result"或"error"类型的IQ应答(这个应答必须(MUST)保留相关请求的'id'属性).
    4. 一个接收到"result"或"error"类型的IQ节的实体不能(MUST NOT)再发送更多的"result"或"error"类型的IQ应答; 无论如何, 如上所述, 请求实体可以(MAY) 发送另一个请求(如, 一个"set"类型的IQ,通过get/result对提供查询(discovery)所需的信息).
    5. 一个"get" 或 "set" 类型的IQ节必须(MUST)包含并只包含一个子元素指明特定请求或应答的语义.
    6. 一个"result"类型的IQ节必须(MUST)包含零或一个子元素.
    7. 一个"error"类型的IQ节应该(SHOULD)包含和"get"或"set"相关联的那个子元素并且必须(MUST)包含一个<error/>子

     看来底层协议的理解还是必不可少的,虽然有类库的帮助,但是了解根本的东西才是理解类库的最好保证。

  • 相关阅读:
    如何使用腾讯位置服务地图选点组件?
    vue使用腾讯位置服务获取当前位置示例
    腾讯位置服务地址搜索&marker标记demo
    如何优雅接入腾讯地图SDK公交路线规划2?
    如何优雅接入腾讯地图SDK公交路线规划?
    地图SDK自定义路况和字体示例
    腾讯地图SDK自定义地图和路况示例
    手把手教你实现3D地图的定时高亮和点击事件
    vue实现坐标拾取器功能demo
    jmeter之安装ant
  • 原文地址:https://www.cnblogs.com/lwhkdash/p/2515932.html
Copyright © 2020-2023  润新知