企业网站通常包含的栏目做360手机网站优化排
web/
2025/9/27 14:25:24/
文章来源:
企业网站通常包含的栏目,做360手机网站优化排,263企业邮箱登官网,wordpress 图片加水印插件XMPP XEP-0096协议是XMPP中的文件传输协议。 关于文件传输#xff0c;在xmpp协议中有不少协议可以实现#xff0c;而XEP-0096协议是其中非常简单的一个协议。由于邮件被删#xff0c;我的代码demo丢失#xff0c;因此只能在这里给大家讲一下其中的逻辑实现#xff0… XMPP XEP-0096协议是XMPP中的文件传输协议。 关于文件传输在xmpp协议中有不少协议可以实现而XEP-0096协议是其中非常简单的一个协议。由于邮件被删我的代码demo丢失因此只能在这里给大家讲一下其中的逻辑实现大家可以以此来写出代码。 首先申明一下以下是我个人对XEP-0096协议的一些认识和解释如有疑问请发邮件到lizhanzhishanggmail.com 欢迎交流~ 我们根据openfire服务器做开发但是服务器在这里只是起路由寻址和转发的作用实质上是完全点对点的通信数据处理由客户端来做。 我们可以举一个栗子有两部手机互相之间使用message协议传递信息的完整message XML数据可以看看一个客户端发送的是什么信息另一个客户端接收的又是什么message信息要是一样说明的是服务器是转发的数据要是不一样的 话则可能带有IQ MSGPr信息。但是总是有例外的服务器也要对连接的数据做一些心跳包。 下面是一组请求(一方发出“发送文件”请求接收方发出“拒绝接受”请求) 这是”发送文件”的一段数据请求图片小可以双击放大 将接受方拒绝接受文件的信息返回给发送方 就此请求完毕一方发出了“发送文件”的请求另一方“拒绝”了这个请求。 这里有一个完整的数据传输协议在官方的文档上是这样写的 In order to enable seamless file transfer and appropriate fall-back mechanisms, implementations of this profile MUST support both SOCKS5 Bytestreams (XEP-0065) [4] and In-Band Bytestreams (XEP-0047) [5], to be preferred in that order. The associated namespaces are to be included as option values for the stream-method variable as shown in the examples below. 上面的意思是说文件传输实际上是有协议XEP-0065和XEP-0047来进行的而XEP-0096实际是传输IQ的消息协议真正的传输数据并不 在次协议中实现文件传输协议必须是full JID而且要求接收方在线。如果”to”(接收端) ”from”(发送端) 不是一个full JID服务器就会发送error信息到”发送端”说明服务器现在出现异常问题。 现在我们来说说在传输消息的时候该怎么具体组织消息 我们可以用IQ或者Message来发送数据。下面是我截取的文档中我觉得相当重要的部分 Each chunk of data is contained in a data/ element qualified by the http://jabber.org/protocol/ibb namespace. The data element SHOULD be sent in an IQ stanza to enable proper tracking and throttling, but instead MAY be sent in a message stanza. The data to be sent, prior to base64-encoding and prior to any wrapping in XML, MUST NOT be larger than the block-size determined in the bytestream negotiation. 上面说啥呢我英语也菜但是能看懂一点2个关键点一个是base64-encodingblock-size这个2个关键的单词说明我们在遇到 大文件的情况下是进行分块发送的每块的数据都是一定字节的例如我们发送数据1024字节但是那个流怎么发送呢都是二进制的。我们直接发送呢数 据太大不好整的再则直接转String呢那也是有问题的因为String遇到’\o’就说明数据结束会使数据漏掉很多。 文档中告诉我们将发送的文件转换为base64之后再转为String类型放入IQ或者Message数据格式中发送。关于base64的理论资料在 这里:http://zh.wikipedia.org/zh-cn/Base64 下面是一个数据实例 参考的url地址http://xmpp.org/extensions/xep-0096.html Use of Message Stanzas It is RECOMMENDED to use IQ stanzas when sending data packets. However, an application MAY use message stanzas instead. If message stanzas are used when sending data packets, the sender SHOULD also useAdvanced Message Processing (XEP-0079) [8] or some other stanza flow-control method. For proper tracking of delivery and processing errors related to data packets, the id attribute SHOULD be used with message stanzas. 上面的base64数据不一定用IQ发送还可以用Message发送。只是在参数上有个改变一下就可以哈哈。 例子如下所示 突然想起一件事情。。。在发送文件的时候会有一个带si 标签的数据段这个数据段有id。这个id很重要是必须要保存的。主要用在传输数据的时候要是这个sid要是没有带上那服务器就会返回错误信息给文件发送方。 还有个小事情我当初解析命名空间的时候以为是一般属性总是解析不出来。最后发现有专门解析命名空间的东西大家可以去google下。。。 下面是进行文件传输的XEP-0096协议的完整xml例子:数据协议都是人定的哈哈文件发送方: 我们可以对此IQ数据段解析当发现file 标签的命名空间是http://jabber.org/protocol/si/profile/file-transfer的 时候 则表明这是“文件传输”消息请求。说明有人要传文件了。对于这个xml请求我们在提取数据的时候必须提取si标签的ID。这个ID很 重要是下面的sid传输数据的重要参数也是判断是否是同一个数据流的依据。还有就是提取mine-type标签内容这个是我们用来判断接收的是何种 文件并以此判断创建该类型文件把将要传来的数据写入这个文件还有就是size标签内容来检验我们接收的文件是否完整。下面是一个完整的没有进行base64转换的数据请求:文件接收方: 这里说明我要接受的数据是什么协议主要在file var这个参数stream-method x submit这个表明我要接受数据你可以发给我了。 发送文件方: 其实也要实现这个xml的我不知道当我接受数据之后为什么要查询对方的机器名字和一些基本数据这可能是进行确认。 接受方发出本机基本信息主要有3个参数categoryclient nameSmack typepc 查询之后就开始要发数据了哈哈。 发出数据肯定要打开流发送数据结束也要关闭流的哈哈发送方发送打开消息 这个xml虽然很少但是每个数据都很重要呢。Open的命名空间很熟悉那。其实这个就是前面刚开始接受数据file里的valueblock- size说的是我每次传数据都是以4096字节发送一个数据流。 这个sid就是发送方发送请求文件的那个si标签的id。都是相同的同时还有一个重要的东西stanzaiq这个相当的重 要这个标签告诉对方我要以IQ数据类型发送数据这里也可以用message代替iq。前面我已经提及到。下面的是message发送base64数据如果stanzamessage” 自己可以参照IQ发送base64数据。过程基本一样就是iq变成message而已:接受方数据xml: 上面的2个IQ是顺序发送的不可逆第一个是主要告诉对方。同时那3个参数是上上面的一样的要不是无法接收到额还有一些对特征解释说明传输的可以哪些流、然后紧接着告诉对方我可以解释数据了。发送方开始发数据了哈哈 这个data的value是前面的数据块4096字节base64加密数据。如果数据base64大于这个块。我们接到这个数据首先要base64解密之后再写入刚才建立的文件中Sid是上面我们说的第一次si 标签的id。不能改变更不能为null。也不要不设置不然服务器就会返回错误信息。 Seq是从0开始的如果还有流就会依次递增的如果接受处理完毕就发送一个iq。说明接受完成 说明一下哈data里的数据被我删掉N多,我这主要是说明用。接受方 发一个一个4096字节base64加密数据。这个是源文件base64加密偏移的数据。 上面的seq变成1了而sid依然没变。接受完成处理后一样要回复一下告诉他可以继续传数据了。 最后就是base64加密完成传输要colse掉数据。 发送方关闭流这个sid依旧没有变协议是这样规定的: 好吧我知道你关闭流了。我们之间的文件传输完成了:写了几个小时分析真的累。哎下面贴出完整的流程xml下面是整个对话阶段的xml数据: A:发送方 B:接收方 A:iq idx36vr-54 tozhufudomian/android fromsaoniandomian/android typeset si xmlnshttp://jabber.org/protocol/si idjsi_3326887048779603188 mime-typeimage/png profilehttp://jabber.org/protocol/si/profile/file-transfer file xmlnshttp://jabber.org/protocol/si/profile/file-transfer nameimage_9T.png size5204 descSending file/desc /file feature xmlnshttp://jabber.org/protocol/feature-neg x xmlnsjabber:x:data typeform field varstream-method typelist-single option valuehttp://jabber.org/protocol/bytestreams/value /option option valuehttp://jabber.org/protocol/ibb/value /option /field /x /feature /si/iq复制代码B:iq idx36vr-54 tosaoniandomian/android fromzhufudomian/android typeresult si xmlnshttp://jabber.org/protocol/si feature xmlnshttp://jabber.org/protocol/feature-neg x xmlnsjabber:x:data typesubmit field varstream-method valuehttp://jabber.org/protocol/bytestreams/value valuehttp://jabber.org/protocol/ibb/value /field /x /feature /si/iq复制代码A:iq idx36vr-55 tozhufudomian/android typeget fromsaoniandomian/android query xmlnshttp://jabber.org/protocol/disco#info/query/iq复制代码B:iq idx36vr-55 tosaoniandomian/android typeresult fromzhufudomian/android query xmlnshttp://jabber.org/protocol/disco#info identity categoryclient nameSmack typepc/ feature varhttp://www.xmpp.org/extensions/xep-0166.html#ns/ feature varurn:xmpp:tmp:jingle/ /query/iq复制代码A:iq idx36vr-56 tozhufudomian/android typeset fromsaoniandomian/android open xmlnshttp://jabber.org/protocol/ibb block-size4096 sidjsi_3326887048779603188 stanzaiq /open/iq复制代码B:iq idx36vr-55 tosaoniandomian/android typeresult fromzhufudomian/android query xmlnshttp://jabber.org/protocol/disco#info identity categoryclient nameSmack typepc/ feature varhttp://jabber.org/protocol/xhtml-im/ feature varhttp://jabber.org/protocol/muc/ feature varhttp://jabber.org/protocol/bytestreams/ feature varhttp://jabber.org/protocol/commands/ feature varhttp://jabber.org/protocol/si/profile/file-transfer/ feature varhttp://jabber.org/protocol/si/ feature varhttp://jabber.org/protocol/ibb/ /query/iq复制代码B:iq idx36vr-56 tosaoniandomian/android fromzhufudomian/android typeresult/复制代码A:iq idx36vr-57 tozhufudomian/android typeset fromsaoniandomian/android data xmlnshttp://jabber.org/protocol/ibb seq0 sidjsi_3326887048779603188iVBORw0KGgoAAAANSUhEUgAAAEMAA /data/iq复制代码B:iq idx36vr-57 tosaoniandomian/android fromzhufudomian/android typeresult/复制代码A:iq idx36vr-58 tozhufudomian/android typeset fromsaoniandomian/androiddata xmlnshttp://jabber.org/protocol/ibb seq1 sidjsi_3326887048779603188dcwRxoSYEFYOgxc0Qx2TSCNDSJZRTxKFgVmZiKFN/data/iq复制代码B:iq idx36vr-58 tosaoniandomian/android fromzhufudomian/android typeresult/复制代码A:iq idx36vr-59 tozhufudomian/android typeset fromsaoniandomian/androidclose xmlnshttp://jabber.org/protocol/ibb sidjsi_3326887048779603188//iq复制代码B:iq idx36vr-59 tosaoniandomian/android fromzhufudomian/android typeresult/复制代码 转载于:https://my.oschina.net/vdroid/blog/202261
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81088.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!