XMPP在iphone sdk中发送/接收文件......?

时间:2011-06-13 09:14:21

标签: iphone xmpp openfire xmppframework

如何使用xmpp框架在iphone sdk中发送/接收文件? 目前我正在使用XEP-0065类,并使用以下代码:

ObjTURNSocket = [[TURNSocket alloc] initWithStream:((TestAppDelegate*)[[UIApplication sharedApplication] delegate]).xmppStream 
                                                 toJID:chatuser.jid];
    [ObjTURNSocket start:self];

我收到服务器的回复:

<iq type="error" id="AB2ED567-B97F-4DFE-B789-7731A617C239" to="kapil@testweb/6df6dc96" from="jabber.org">
   <query xmlns="http://jabber.org/protocol/disco#items"/>
   <error code="404" type="cancel">
      <remote-server-not-found xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
   </error>
 </iq>`

任何帮助或建议都将受到赞赏。

3 个答案:

答案 0 :(得分:4)

首先,使用您可能用于代理的可能服务器的数组调用setProxyCandidates。默认为“jabber.org”,您的服务器未与jabber.org联合,这就是您收到迪斯科错误的原因。

接下来,在您的委托中,实现以下方法:

- (void)turnSocket:(TURNSocket *)sender didSucceed:(GCDAsyncSocket *)socket;
- (void)turnSocketDidFail:(TURNSocket *)sender;

然后,在didSucceed实现中,使用以下命令在传入的套接字上发送数据:

- (void)writeData:(NSData *)data 
      withTimeout:(NSTimeInterval)timeout 
              tag:(long)tag;

最后,关闭套接字:

- (void)disconnectAfterWriting;

我通过查看TURNSocket.m的来源,寻找硬编码的“jabber.org”,然后搜索[delegate以找到代表被调用的地方来解决这个问题。这让我回到了TURNSocket.h,它有一个协议记录下来供代表实施。

答案 1 :(得分:1)

我最终必须自定义TURNSocket类以满足我的特定需求,以便能够将文件从我的iOS设备传输到另一台设备。如果有可用的代理服务器,那么TURNSocket类可能适合一个人的需要。但如果这是代理服务器可能无法使用的直接连接,则需要进行一些额外的工作来设置设备以便能够连接到另一台设备并直接传输文件。

我能够以当前形式使用TURNSocket接收文件,只进行了一次小修改。正如代码当前所代表的那样,id和sid被赋予相同的值,这不能保证收到的节将具有id和sid的相同唯一标识符值。

答案 2 :(得分:0)

您应该使用xep-96来共享和接收文件。 之后,只需使用相关数据启动xmppSifiletranfer。 像

-(void)sendToOtherDevice:(NSData *)fileData receiverJid:(XmPPJId *)senderFullID file:(NSString *)fileName{

            myFileTransferID=[xmppStream generateUUID];
            XMPPJID *jid =senderFullID;
            sifiletransfer=[[XMPPSIFileTransfer alloc]init];
            [sifiletransfer initiateFileTransferTo:jid withData:fileData file:fileName passedsid:myFileTransferID];

            if ([jid.domain isEqualToString:[xmppStream myJID].domain]) {
                [TURNSocket setProxyCandidates:[NSArray arrayWithObjects:jid.domain, nil]];
            } else {
                [TURNSocket setProxyCandidates:[NSArray arrayWithObjects:jid.domain,[xmppStream myJID].domain, nil]];
            }
             TURNSocket *socket = [[TURNSocket alloc] initWithStream:xmppStream toJID:jid sid:myFileTransferID];
           // [socket setDataToSend:fileData];

            [socket startWithDelegate:self delegateQueue:dispatch_get_main_queue()];
    }
    # delegater of turnsocket
    - (void)turnSocket:(TURNSocket *)sender didSucceed:(GCDAsyncSocket *)socket
    {
        NSLog(@"Socket Suceeed Port For File Transfer: %d",socket.localPort);
        DDLogInfo(@"TURN Connection succeeded!");
        DDLogInfo(@"You now have a socket that you can use to send/receive data to/from the other person.");
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Hurray!!"
         message:@"Conection Established"
         delegate:nil
         cancelButtonTitle:@"Ok"
         otherButtonTitles:nil];
         [alertView show];
    }

if you guys have any other issue regarding file transfer comment below.I will surely help you.