3

如何使用 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>`

任何帮助或建议将不胜感激。

4

3 回答 3

4

首先,调用 setProxyCandidates 并使用您可以用于代理的可能服务器数组。默认值为“jabber.org”,并且您的服务器未与 jabber.org 联合,这就是您返回 disco 错误的原因。

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

- (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,它有一个记录的协议供委托实现。

于 2011-06-14T07:34:16.853 回答
1

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

只需稍作修改,我就能够使用 TURNSocket 以当前形式接收文件。就目前的代码而言,id 和 sid 被分配了相同的值,这不能保证接收到的节对于 id 和 sid 具有相同的唯一标识符值。

于 2011-11-15T16:26:31.097 回答
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.
于 2014-09-20T07:03:56.893 回答