项目中需要用到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
<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>
目标方接收到信息后发送回执,表示同意接收文件
<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协议阶段
初始方给服务器发送信息,请求提供代理服务器
服务器回复信息,告知可用的代理
<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”的代理,初始方给这个代理发送信息获取代理连接信息
代理方回复信息,告知初始方代理的jid、IP、端口等信息
<query xmlns="http://jabber.org/protocol/bytestreams">
<streamhost jid="proxy.192.168.1.113" host="192.168.1.113" port="7777"/>
</query>
</iq>
初始方收到代理信息后将代理的信息发送给目标方
<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
<query xmlns="http://jabber.org/protocol/bytestreams">
<streamhost-used jid="proxy.192.168.1.113"/>
</query>
</iq>
初始方开始与代理建立socket连接(也使用SOCKS5协议),连接成功后给代理发送请求,要求激活文件流
<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>
代理回复激活成功信息
初始方收到回复信息后就进入二进制流传输阶段,这时就可以开始发送二进制流了
等初始方将流发送完毕后把socket流关闭传输就完成了文件的传输。
注意:type为result的回复信息使用的id一定要和请求的信息id一样。
相关推荐
在IT行业中,Openfire是一款基于XMPP(Extensible Messaging and Presence Protocol)协议的实时通信服务器。然而,有时候我们可能需要在不使用XMPP协议的情况下,通过HTTP方式与Openfire客户端进行交互,例如发送...
openfire是xmpp协议的实现,以其及时性和稳定性被倍受青睐,在此贡献出来Android客户端,希望与大家共同探讨。 文章地址:http://blog.csdn.net/sky_monkey/article/details/9495571
openfire内置有一个文件传输代理服务组件,在openfire中以一个内部组件模式提供文件传输服务,服务端口号为默认的7777。该组件基于Socket5字节流文件传输协议(XEP-0065)和基于带内字节流文件传输协议(XEP-0047)...
【标题】:“openfire+smack开发webim笔记”涉及的知识点详解 【一】XMPP(可扩展消息处理现场协议) XMPP是一种基于XML的即时通讯协议,它最初源于Jabber项目,用于实现服务器之间的即时消息传递和在线状态探测。...
总的来说,"基于Openfire 仿QQ"项目展示了如何利用开源技术实现一个功能完备的即时通讯应用,涉及到Android客户端开发、服务器集成、即时通讯协议、用户体验优化等多个方面,对于学习和研究即时通讯系统有着很高的...
【基于openFire服务器的聊天软件客户端】是一款实现了XMPP协议的聊天应用,它利用了openFire作为服务器端,为用户提供了一种高效、安全的实时通信平台。XMPP(Extensible Messaging and Presence Protocol)是一种...
总之,Openfire的离线文件系统是一个复杂但功能强大的机制,它结合了消息存储、文件传输、权限控制和性能优化等多个方面的技术。通过深入理解这一系统,开发者不仅可以为用户提供更好的即时通讯体验,也能为自己的IT...
在Java客户端开发中,Openfire提供了JStrophe库,这是一个轻量级的JavaScript库,用于处理XMPP协议。 二、Java客户端开发基础 1. **XMPP协议**:XMPP(Extensible Messaging and Presence Protocol)是一种基于XML...
【描述】提到:"自己写的openfire插件,可记录一对一,会议室聊天记录,内附sql文件,数据库mysql,赚点积分。嘿嘿",这表明这个插件是由个人开发者编写的,可能并非官方提供,但依然能有效地实现聊天记录的存储。...
XMPP(Extensible Messaging and Presence Protocol)是一种开放的即时通讯协议,它允许用户进行实时通信,包括聊天、文件传输、群聊以及各种扩展服务。Openfire是一款基于XMPP协议的服务器软件,它提供了高效、安全...
jitsi 基于 openfire 的 视频通话 客户端
Openfire IM Android客户端是一款专为Android平台设计的即时通讯应用,它基于Openfire服务器,提供高效、安全且可自定义的聊天服务。Openfire是一款开源的XMPP服务器,支持多种协议,包括XMPP(Extensible Messaging...
在这个“android Openfire的测试客户端程序”中,MyXmpp很可能是一个包含源代码和资源文件的项目,用于展示如何实现上述功能。开发者可以通过阅读代码学习如何使用XMPP库与Openfire进行交互,从而构建自己的Android...
【Android代码-基于openfire和smack的安卓xmpp客户端】是一个项目,它实现了使用XMPP协议在Android设备上创建一个客户端应用。XMPP(Extensible Messaging and Presence Protocol)是一种实时通信协议,常用于实现...
XMPP允许用户进行一对一、多对一甚至多对多的聊天,同时支持文件传输、群组聊天和在线状态显示。因此,对于Android客户端而言,理解和实现XMPP协议是至关重要的。 在"AdXmpp"这个压缩包文件中,我们可以推测它可能...
openfire 脚本文件
Openfire提供了一个强大且易于管理的后台,支持多用户聊天、群组聊天、文件传输等功能,适用于企业级和开发者的即时通讯需求。 【Flex技术】 Flex是Adobe公司推出的一款用于创建富互联网应用(Rich Internet ...
首先需要搭建openfire服务器,然后在com.qq.util包中,Const类,修改XMPP_HOST内容。
总结来说,Spark汉化包是针对Openfire客户端的中文本地化解决方案,旨在为中文用户提供更友好的使用体验。通过下载、解压、替换和重启等步骤,用户可以将Spark从英文界面转换为中文界面,提高其在中国市场的适用性和...
在本教程中,我们将深入探讨如何使用Smack 3.0.4库和Openfire 3.10.2服务器来开发一个Android客户端,重点在于实现用户登录、注册功能以及与XMPP服务器的交互。首先,让我们理解这两个关键组件。 **Smack 3.0.4** ...