XMPP之文件传输报文

最近在做文件传输,遇到只能发送文件到spark,spark发送文件来不能接收,要么一直等待,要么发一下就要重试,这天终于找到问题的所在了
我的openfire里面的:服务器->服务器设置->文件传输设置 里面的代理服务被禁用了,应该要使用里面的“使用”

这是我同学总结分析出来的传输文件的报文,由于我们两个是一起在做,我就不去抓了,为了记笔记不得不发一下

发送文件场景:
1,对方拒接
2,对方同意接受
	2.1对方中途中断接收
	2.2我方中途中断发送
	2.3发送成功

------------------------------拒绝接受

A请求向B发送一个文件
<iq type=‘set‘ to=‘[email protected]/Spark‘ id=‘file_33fe4dbdf2364‘ xmlns=‘jabber:client‘>
	<si xmlns=‘http://jabber.org/protocol/si‘ id=‘jsi_33fe4dbdf2313‘ profile=‘http://jabber.org/protocol/si/profile/file-transfer‘ mime-type=‘application/pdf‘>
		<file xmlns=‘http://jabber.org/protocol/si/profile/file-transfer‘ name=‘File (2).pdf‘ size=‘457701‘/>
		<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/ibb</value>
					</option>
				</field>
			</x>
		</feature>
	</si>
</iq>

B拒绝
<iq xmlns="jabber:client" id="file_33fe4dbdf2364" to="[email protected]/8xz8uslghx" from="[email protected]/Spark" type="error">
	<error code="406" type="MODIFY">
		not-acceptable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
	</error>
</iq>

------------------------------------同意接受,并完成发送
A请求向B发送一个文件。包含一些文件的信息,以及发送文件所使用的stream-method,提供了option,可选项,这里
实现了ibb方式,所以只提供这种方式。
<iq type=‘set‘ to=‘[email protected]/Spark‘ id=‘file_33fe66c647645‘ xmlns=‘jabber:client‘>
	<si xmlns=‘http://jabber.org/protocol/si‘ id=‘jsi_33fe66c647209‘ profile=‘http://jabber.org/protocol/si/profile/file-transfer‘ mime-type=‘application/pdf‘>
		<file xmlns=‘http://jabber.org/protocol/si/profile/file-transfer‘ name=‘File (1).pdf‘ size=‘1073243‘/>
		<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/ibb</value>
					</option>
				</field>
			</x>
		</feature>
	</si>
</iq>

B同意接收文件,同时也指明了使用ibb方式
<iq xmlns="jabber:client" id="file_33fe66c647645" to="[email protected]/8xz8uslghx" from="[email protected]/Spark" 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/ibb</value>
				</field>
			</x>
		</feature>
	</si>
</iq>

A发送一个open表示初始化了通道,并通知对方,每一块的data大小为4096(当然,这是指最大的,最后一块可能没有4096)
<iq type=‘set‘ to=‘[email protected]/Spark‘ id=‘efd57f0e-ba5a-4cbe-b68b-d7e1353839c2:ibb‘ xmlns=‘jabber:client‘>
	<open xmlns=‘http://jabber.org/protocol/ibb‘ stanza=‘iq‘ sid=‘jsi_33fe66c647209‘ block-size=‘4096‘/>
</iq>

B回发一个result表示接受。
<iq xmlns="jabber:client" id="efd57f0e-ba5a-4cbe-b68b-d7e1353839c2:ibb" to="[email protected]/8xz8uslghx" from="[email protected]/Spark" type="result"/>

A接着将发送多次的data,直至将数据发送完毕。注意:data中的seq是发送的第几块数据
<iq type=‘set‘ to=‘[email protected]/Spark‘ id=‘b8ef6e92-66c8-41f9-aa16-711d471b5b7a:ibb‘ xmlns=‘jabber:client‘>
	<data xmlns=‘http://jabber.org/protocol/ibb‘ seq=‘0‘ sid=‘jsi_33fe66c647209‘>数据在这里</data>
</iq>

B回复一个iq result表示收到上面的data。注意,只有收到B的这个回复,A才会发送下一个data。
<iq xmlns="jabber:client" id="b8ef6e92-66c8-41f9-aa16-711d471b5b7a:ibb" to="[email protected]/8xz8uslghx" from="[email protected]/Spark" type="result"/>

...经过多次发送,数据发送完成

A将会发送一个close告诉B,数据已经发送完毕了
<iq type=‘set‘ to=‘[email protected]/Spark‘ id=‘f113f9f8-619b-4446-8551-3e85d7bbd065:ibb‘ xmlns=‘jabber:client‘>
	<close xmlns=‘http://jabber.org/protocol/ibb‘ sid=‘jsi_33fe66c647209‘/>
</iq>

B回复一个iq result表示知道了
<iq xmlns="jabber:client" id="f113f9f8-619b-4446-8551-3e85d7bbd065:ibb" to="[email protected]/8xz8uslghx" from="[email protected]/Spark" type="result"/>

------------------------------------同意接受,但A中断发送
前面代码一样的

A发送一个close强制中断发送
<iq type=‘set‘ to=‘[email protected]/Spark‘ id=‘25384610-3cb2-4b21-8017-cde4d33fed07:ibb‘ xmlns=‘jabber:client‘>
	<close xmlns=‘http://jabber.org/protocol/ibb‘ sid=‘jsi_33fe9304c6907‘/>
</iq>

B返回iq result确认
<iq xmlns="jabber:client" id="ff5767cb-7677-43e8-9e9c-ae7493ab7a04:ibb" to="[email protected]/76xgw7w2r6" from="[email protected]/Spark" type="result"/>

------------------------------------同意接受,但B中断接收
前面代码一样

B发送来一个close强制中断接收
<iq xmlns="jabber:client" id="pfVx0-912" to="[email protected]/76xgw7w2r6" type="set" from="[email protected]/Spark">
	<close xmlns="http://jabber.org/protocol/ibb" sid="jsi_33fe9702f3329"/>
</iq>

A确认收到并停止继续发送
<iq type=‘result‘ to=‘[email protected]/Spark‘ id=‘pfVx0-912‘ xmlns=‘jabber:client‘/>
  

  

时间: 2024-12-19 16:56:07

XMPP之文件传输报文的相关文章

XMPP系列(五)---文件传输

xmpp中发送文件和接收文件的处理有些不太一样,接收文件处理比较简单,发送稍微复杂一些. 首先需要在XMPPFramework.h中添加文件传输类 //文件传输 //接收文件 #import "XMPPIncomingFileTransfer.h" //发送文件 #import "XMPPOutgoingFileTransfer.h" 1.文件接收 文件的接收是被动的,所以需要在XMPPStream初始化的地方加入文件接收模块: //5.文件接收 _xmppInco

XMPP——Smack[5]文件传输及离线消息的获取

三天时间,赶在最后一下午实现了文件的传输,本来需要实现离线文件的发送的,一直没想好怎么弄,找openfire的离线文件插件没找到,后来想出一种方法,起服务器时起了一个系统用户,一直在线,当用户发送离线文件,检测到对方不存在,先发给系统用户,存到服务器路径,并在数据库中保存信息,当对方上线时,系统用户查表,拿文件发送 想是这么想的,问题是时间太紧,没有实现,囧. 下一篇写离线消息和离线文件 文件的发送 开一个文件选择框,选中文件后再调用下面的方法 [java] view plaincopyprin

Linux下几种文件传输命令

Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具.由于它是基于SSH的,会在传输过程中对用户的密码.数据等敏感信息进行加密,因此可以有效的防止用户信息在传输的过程中被窃取,比FTP有更高的安全性.在功能方面与FTP很类似,不仅可以传输文件数据,而且可以进行远程的文件管理(如建立,删除,查看文件列表等操作).Sftp与ftp虽然只有一字之差,但基于

linux不同系统的文件传输与网络管理,一些网络协议的tip

目录 ****12.不同系统之间的文件传输****2 1.文件归档2 2.压缩2 gz2 bz22 xz2 zip2 3.系统中的文件传输2 ****11.管理网络****2 1.ip基础知识2 1.ipv42 2.配置ip2 1.图形界面2 2.文本化图形2 3.<<命令>>2 4.<<文件>>2 4.1 dhcp //动态获取2 4.2 static|none //静态网络2 ************************************* *

iOS客户端 Openfire服务 利用XEP-0065和XEP-0096 做out-of-band bytestream文件传输

Openfire服务可以做文件传输方法可供选择有: XEP-0047: in-band bytestreams:带内字节流传输协议 base64编码后放入iq消息,同普通文字消息,编解码需耗点资源效率一般,适用于较小文件: XEP-0096: SI File Transfer:文件传输流初始化协议  文档中提到可自行选择开发支持断点续传.当file元素包含range无素时,range包含offset.length两个属性,可以指出要传送的数据位于文件的什么位置. XEP-0065: SOCKS5

Linux的文件传输命令总结

因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp,wget,curl. rcp rcp不是一种安全的的传输文件的方式,rcp通过rsh(rsh见下面)来执行远程命令,要使用rcp必须经过一些配置,现在rcp已经被scp取代了,常用scp来进行文件传输.要使用rcp,需要具备以下条件: (1)如果系统中有/etc/hosts 文件,应确保该文件包含要

C#实现http协议下的多线程文件传输

用C#实现HTTP协议下的多线程文件传输转自  http://developer.51cto.com/art/201105/263066_all.htm C#(C Sharp)是微软(Microsoft)为.NET Framework量身订做的程序语言,C#拥有C/C++的强大功能以及Visual Basic简易使用的特性,是第一个组件导向(Component-oriented)的程序语言,和C++与Java一样亦为对象导向(object-oriented)程序语言.下面主要介绍的是用C#实现H

android asmack 注册 登陆 聊天 多人聊天室 文件传输

XMPP协议简介 XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议)是一种基于XML的协议,目的是为了解决及时通信标准而提出来的,最早是在Jabber上实现的.它继承了在XML环境中灵活的发展性.因此,基于XMPP的应用具有超强的可扩展性.并且XML很易穿过防火墙,所以用XMPP构建的应用不易受到防火墙的阻碍.利用XMPP作为通用的传输机制,不同组织内的不同应用都可以进行有效的通信. 这篇文章有基本的介绍,http://bl

linux下常用文件传输命令(转)

因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp,wget,curl. rcp rcp不是一种安全的的传输文件的方式,rcp通过rsh(rsh见下面)来执行远程命令,要使用rcp必须经过一些配置,现在rcp已经被scp取代了,常用scp来进行文件传输.要使用rcp,需要具备以下条件: (1)如果系统中有/etc/hosts 文件,应确保该文件包含要