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

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

转自:http://www.cnblogs.com/edisongz/p/4499157.html

Openfire服务可以做文件传输方法可供选择有:

  1.  具体看协议文档,没搞过;XEP-0096中提到XEP-0066的drawbacks,原文:
    •   It is not reliable.
    •   It does not work when one of the parties is behind a firewall.
    •   It provides limited metadata about files to be exchanged
  • 还有一种,自建个文件服务器,发送方发送文件到文件服务器,上传成功后生成相应的缩略图(如果是图片文件的话)推送完成的消息给接收方,接收方收到消息后,去下载相应的文件,比较好理解,但我猜想每次比上述的方式多了次 磁盘IO;项目进度急得话,也是可以选用,可后续优化嘛。

我选的是XEP-0096和XEP-0065 :

XEP-0096对应的iOS版本文件 地址,XEP-0065 iOS 版本也可用上述地址的版本

初始化XMPPStream时需要注意:

1
2
3
XMPPJID *jid = [XMPPJID jidWithString:[ NSString  stringWithFormat:@ "%@@%@" , account, XMPPDomain]];
XMPPJID *jidWithResource = [jid jidWithNewResource:@ "ios" ];
[ self .xmppStream setMyJID:jidWithResource];

  普通JID格式如:account@domain (形如 hanmeimei@test)

  第二行带上resource,不带我的程序报错:

  <error code="503" type="cancel"><service-unavailable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error>

  应该是两端的resource不一致

 

初始化XMPPSIFileTransfer相应代码:

1
2
3
4
5
NSString  *sessionId = [_xmppStream generateUUID];
_sifiletransfer = [[XMPPSIFileTransfer alloc] init];
_sifiletransfer.sid = sessionId;
[_sifiletransfer addDelegate: self  delegateQueue:dispatch_get_main_queue()];
[_sifiletransfer activate:_xmppStream];

发送文件:

1
2
3
4
- ( void )sendImageMessage:( NSData  *)imageData toAccount:( NSString  *)account{
     XMPPJID *jid = [XMPPJID jidWithString:[ NSString  stringWithFormat:@ "%@@%@/%@" , account, XMPPDomain, [[_xmppStream myJID] resource]]];
     [_sifiletransfer initiateFileTransferTo:jid withData:imageData];
}

  其中文件接收方的JID完整格式:account@domain/resource (形如 hanmeimei@test/ios)

发送完成后在XMPPSIFileTransfer.h中的

1
2
3
4
@protocol  XMPPSIFileTransferDelegate < NSObject >
@required
- ( void )receivedImage:( NSData *)image from:(XMPPJID*)from;
@end

  可在你自己的文件中实现该方法接受文件

至此,我在内网可以通过此方式传输文件,Mac下得openfire服务,可选用源码或dmg方式 均可;

后来测试一端内网,一端外网出现错误,提示为:

  <error code="404" type="cancel"><item-not-found xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error>

 

openfire后台配置:

注意xmpp.proxy.externalip 填写你测试服务器的外网地址

openfire后台配置

 

路由器的7777端口也要映射到外网,如图:

router setting

 

至此,内外网两端发送文件测试也通过。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值