码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-05-13 06:05:03      阅读:333      评论:0      收藏:0      [点我收藏+]

标签:

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

     具体看协议文档,没搞过;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时需要注意:

    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相应代码:

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

发送文件:

- (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中的

@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 填写你测试服务器的外网地址

技术分享

 

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

技术分享

 

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

希望能帮到您。

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

标签:

原文地址:http://www.cnblogs.com/edisongz/p/4499157.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!