`
wkkyo
  • 浏览: 30739 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

openfire客户端文件传输学习笔记(一)

    博客分类:
  • Java
 
阅读更多

项目中需要用到openfire的文件传输,但是客户端使用flex,官方提供的xiff包中并没有封装文件传输的功能,没办法,研究了几天,在google和官方smock源码的帮助下终于实现了xiff下的文件传输,在这里做个总结。

openfire服务器是基于xmpp协议的,XMPP支持两种文件流传输协议,SOCKS5 Bytestreams和 In-Band Bytestreams,SOCKS5是直接发送二进制流,而IBB是将文件转成base64码进行然后用message的形式进行传输,我这里仅实现了SOCKS5的文件代理传输。
SOCKS5文件传输需要用到两个协议,XEP-0065和XEP-0096
XEP-0096定义文件传输协议,提供了一个模块化框架使能交换被传输文件的信息以及参数的协商,也就是在传输文件之前协商将要传输的文件信息。
XEP-0065定义SOCKS5流传输标准协议,提供用于在任意两个XMPP用户之间建立字节流并进行文件传输。
根据我的理解,文件传输的过程分为协商,建立socks5连接,二进制传输这三个阶段
协商的过程最复杂,然后是建立连接,传输就比较简单,下面一个一个来讲
协商包括初始方、目标方、代理方,初始方就是发送文件方,目标方即文件接收方,代理方是socks5代理服务器,

协商过程就是三方互相发送xml来交换信息的过程,通俗点就是三个人沟通一下传什么文件和怎么传文件。
首先遵循XMP-0096协议,初始方给目标方发送包含文件信息的xml

<iq to="android@192.168.1.113/Spark 2.6.3" type="set" id="iq_13" from="iphone@192.168.1.113/xiff">
    <si profile="http://jabber.org/protocol/si/profile/file-transfer" mime-type="text/plain" id="82B0C697-C1DE-93F9-103E-481C8E7A3BD8" xmlns="http://jabber.org/protocol/si">
        <feature xmlns="http://jabber.org/protocol/feature-neg">
            <x xmlns="jabber:x:data" type="form">
                <field var="stream-method" type="list-single">
                    <option><value>http://jabber.org/protocol/bytestreams</value></option>
                    <option><value>http://jabber.org/protocol/ibb</value></option>
                </field>
            </x>
        </feature>
        <file xmlns="http://jabber.org/protocol/si/profile/file-transfer" name="img0545.png" size="152443"><desc>send</desc></file>
    </si>
</iq>

 
目标方接收到信息后发送回执,表示同意接收文件

<iq id="iq_13" to="iphone@192.168.1.113/xiff" from="android@192.168.1.113/Spark 2.6.3" type="result">
    <si xmlns="http://jabber.org/protocol/si">
        <feature xmlns="http://jabber.org/protocol/feature-neg">
            <x xmlns="jabber:x:data" type="submit">
                <field var="stream-method">
                     <value>http://jabber.org/protocol/bytestreams</value>
                     <value>http://jabber.org/protocol/ibb</value>
                </field>
             </x>
        </feature>
     </si>
</iq>

 

这时进入XEP-0065协议阶段
初始方给服务器发送信息,请求提供代理服务器

<iq id="iq_15" type="get"><query xmlns="http://jabber.org/protocol/disco#items" /></iq>


服务器回复信息,告知可用的代理

<iq type="result" id="iq_15" to="iphone@192.168.1.113/xiff">
    <query xmlns="http://jabber.org/protocol/disco#items">
        <item jid="proxy.192.168.1.113" name="Socks 5 Bytestreams Proxy"/>
        <item jid="pubsub.192.168.1.113" name="Publish-Subscribe service"/>
        <item jid="conference.192.168.1.113" name="公共房间"/>
        <item jid="search.192.168.1.113" name="User Search"/>
    </query>
</iq>

 
这里选择name=“Socks 5 Bytestreams Proxy”的代理,初始方给这个代理发送信息获取代理连接信息

<iq id="iq_17" to="proxy.192.168.1.113" type="get"><query xmlns="http://jabber.org/protocol/bytestreams" /></iq>

 

代理方回复信息,告知初始方代理的jid、IP、端口等信息

<iq type="result" id="iq_17" from="proxy.192.168.1.113" to="iphone@192.168.1.113/xiff">
    <query xmlns="http://jabber.org/protocol/bytestreams">
        <streamhost jid="proxy.192.168.1.113" host="192.168.1.113" port="7777"/>
    </query>
</iq>

 
初始方收到代理信息后将代理的信息发送给目标方

<iq to="android@192.168.1.113/Spark 2.6.3" type="set" id="iq_19" from="iphone@192.168.1.113/xiff">
    <query xmlns="http://jabber.org/protocol/bytestreams" mode="tcp" sid="82B0C697-C1DE-93F9-103E-481C8E7A3BD8">
        <streamhost port="7777" host="192.168.1.113" jid="proxy.192.168.1.113" />
    </query>
</iq>

 

然后就进入连接阶段,也就是初始方和目标方分别和代理建立socks5连接的过程。(关于SOCKS5协议连接,我之后会补充)。
目标方收到代理信息后和代理建立socket连接(使用SOCKS5协议连接),连接成功后通知初始方使用的代理jid

<iq id="iq_19" to="iphone@192.168.1.113/xiff" type="result" from="android@192.168.1.113/Spark 2.6.3">
    <query xmlns="http://jabber.org/protocol/bytestreams">
        <streamhost-used jid="proxy.192.168.1.113"/>
    </query>
</iq>

 
初始方开始与代理建立socket连接(也使用SOCKS5协议),连接成功后给代理发送请求,要求激活文件流

<iq to="proxy.192.168.1.113" type="set" id="iq_21" from="iphone@192.168.1.113/xiff">
<query xmlns="http://jabber.org/protocol/bytestreams" sid="82B0C697-C1DE-93F9-103E-481C8E7A3BD8">
<activate>android@192.168.1.113/Spark 2.6.3</activate>
</query>
</iq>

 
代理回复激活成功信息

<iq type="result" id="iq_21" from="proxy.192.168.1.113" to="iphone@192.168.1.113/xiff"/>

初始方收到回复信息后就进入二进制流传输阶段,这时就可以开始发送二进制流了

等初始方将流发送完毕后把socket流关闭传输就完成了文件的传输。

 

注意:type为result的回复信息使用的id一定要和请求的信息id一样。

 

分享到:
评论
4 楼 luozhiren 2012-11-02  
楼主   连接socket5怎么连接啊  求源码  我现在正在做这个  我的邮箱是luozhirenlzr@163.com    非常感谢  
3 楼 a805617894a 2012-10-18  
楼主as连接socket5怎么连接啊,网上没有找到资料
2 楼 lspgdut 2012-03-15  
有没有源杩的???
1 楼 luoaz 2012-02-17  
楼主,怎么没讲到 socks5 建立连接的协商过程呢?

相关推荐

    通过http方式,向openfire客户端发信息(非XMPP协议)

    在IT行业中,Openfire是一款基于XMPP(Extensible Messaging and Presence Protocol)协议的实时通信服务器。然而,有时候我们可能需要在不使用XMPP协议的情况下,通过HTTP方式与Openfire客户端进行交互,例如发送...

    openfire的Android客户端实现

    openfire是xmpp协议的实现,以其及时性和稳定性被倍受青睐,在此贡献出来Android客户端,希望与大家共同探讨。 文章地址:http://blog.csdn.net/sky_monkey/article/details/9495571

    openfire文件传输功能转移

    openfire内置有一个文件传输代理服务组件,在openfire中以一个内部组件模式提供文件传输服务,服务端口号为默认的7777。该组件基于Socket5字节流文件传输协议(XEP-0065)和基于带内字节流文件传输协议(XEP-0047)...

    openfire+smack开发webim笔记

    【标题】:“openfire+smack开发webim笔记”涉及的知识点详解 【一】XMPP(可扩展消息处理现场协议) XMPP是一种基于XML的即时通讯协议,它最初源于Jabber项目,用于实现服务器之间的即时消息传递和在线状态探测。...

    基于openfire 仿QQ

    总的来说,"基于Openfire 仿QQ"项目展示了如何利用开源技术实现一个功能完备的即时通讯应用,涉及到Android客户端开发、服务器集成、即时通讯协议、用户体验优化等多个方面,对于学习和研究即时通讯系统有着很高的...

    基于openFire服务器的聊天软件客户端

    【基于openFire服务器的聊天软件客户端】是一款实现了XMPP协议的聊天应用,它利用了openFire作为服务器端,为用户提供了一种高效、安全的实时通信平台。XMPP(Extensible Messaging and Presence Protocol)是一种...

    openfire离线文件

    总之,Openfire的离线文件系统是一个复杂但功能强大的机制,它结合了消息存储、文件传输、权限控制和性能优化等多个方面的技术。通过深入理解这一系统,开发者不仅可以为用户提供更好的即时通讯体验,也能为自己的IT...

    jitsi 基于 openfire 的 视频通话 客户端

    jitsi 基于 openfire 的 视频通话 客户端

    openfire Java客户端开发文档详解

    在Java客户端开发中,Openfire提供了JStrophe库,这是一个轻量级的JavaScript库,用于处理XMPP协议。 二、Java客户端开发基础 1. **XMPP协议**:XMPP(Extensible Messaging and Presence Protocol)是一种基于XML...

    openfire 聊天记录插件(单聊群聊)

    【描述】提到:"自己写的openfire插件,可记录一对一,会议室聊天记录,内附sql文件,数据库mysql,赚点积分。嘿嘿",这表明这个插件是由个人开发者编写的,可能并非官方提供,但依然能有效地实现聊天记录的存储。...

    基于xmpp协议的openfire android客户端

    XMPP(Extensible Messaging and Presence Protocol)是一种开放的即时通讯协议,它允许用户进行实时通信,包括聊天、文件传输、群聊以及各种扩展服务。Openfire是一款基于XMPP协议的服务器软件,它提供了高效、安全...

    openfire Im android 客户端

    Openfire IM Android客户端是一款专为Android平台设计的即时通讯应用,它基于Openfire服务器,提供高效、安全且可自定义的聊天服务。Openfire是一款开源的XMPP服务器,支持多种协议,包括XMPP(Extensible Messaging...

    android Openfire的测试客户端程序

    在这个“android Openfire的测试客户端程序”中,MyXmpp很可能是一个包含源代码和资源文件的项目,用于展示如何实现上述功能。开发者可以通过阅读代码学习如何使用XMPP库与Openfire进行交互,从而构建自己的Android...

    Android代码-基于openfire和smack的安卓xmpp客户端

    【Android代码-基于openfire和smack的安卓xmpp客户端】是一个项目,它实现了使用XMPP协议在Android设备上创建一个客户端应用。XMPP(Extensible Messaging and Presence Protocol)是一种实时通信协议,常用于实现...

    openfire android客户端

    XMPP允许用户进行一对一、多对一甚至多对多的聊天,同时支持文件传输、群组聊天和在线状态显示。因此,对于Android客户端而言,理解和实现XMPP协议是至关重要的。 在"AdXmpp"这个压缩包文件中,我们可以推测它可能...

    openfire 脚本文件

    openfire 脚本文件

    基于openfire的即时通讯客户端实例

    Openfire提供了一个强大且易于管理的后台,支持多用户聊天、群组聊天、文件传输等功能,适用于企业级和开发者的即时通讯需求。 【Flex技术】 Flex是Adobe公司推出的一款用于创建富互联网应用(Rich Internet ...

    Openfire Android客户端Demo

    首先需要搭建openfire服务器,然后在com.qq.util包中,Const类,修改XMPP_HOST内容。

    spark 汉化包,一个关于openfire的客户端软件的汉化包

    总结来说,Spark汉化包是针对Openfire客户端的中文本地化解决方案,旨在为中文用户提供更友好的使用体验。通过下载、解压、替换和重启等步骤,用户可以将Spark从英文界面转换为中文界面,提高其在中国市场的适用性和...

    基于Smack3.0.4+ Openfire3.10.2开发之Android 客户端之三

    在本教程中,我们将深入探讨如何使用Smack 3.0.4库和Openfire 3.10.2服务器来开发一个Android客户端,重点在于实现用户登录、注册功能以及与XMPP服务器的交互。首先,让我们理解这两个关键组件。 **Smack 3.0.4** ...

Global site tag (gtag.js) - Google Analytics