【问题标题】:service-unavailable 503 error for file transfer in XMPP with iOS使用 iOS 在 XMPP 中传输文件的服务不可用 503 错误
【发布时间】:2014-12-02 17:42:06
【问题描述】:

我正在使用 XMPP 和 iOS 进行文件传输。

我正在使用以下代码行来发送文件。但是我不断遇到单个错误并陷入困境。

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

我在应用程序中使用以下代码在两个设备之间发送文件。

XMPPJID *jid = self.chatUserJID;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                     NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString* path = [documentsDirectory stringByAppendingPathComponent:
                  @"aqua.png" ];
UIImage* image = [UIImage imageWithContentsOfFile:path];

XMPPSIFileTransfer *sifiletransfer=[[XMPPSIFileTransfer alloc]init];

[sifiletransfer initiateFileTransferTo:jid withData:UIImagePNGRepresentation(image)];
sifiletransfer.sid = [[self xmppStream] generateUUID];

if ([jid.domain isEqualToString:[self.xmppStream myJID].domain]) {
    [TURNSocket setProxyCandidates:[NSArray arrayWithObjects:jid.domain, nil]];
} else {
    [TURNSocket setProxyCandidates:[NSArray arrayWithObjects:jid.domain,[self.xmppStream myJID].domain, nil]];
}
TURNSocket *socket = [[TURNSocket alloc] initWithStream:[[self appDelegate] xmppStream] toJID:jid];;
[socket startWithDelegate:self delegateQueue:dispatch_get_main_queue()];

文件传输的日志如下所示。

发送:

<iq type="get" to="192.168.2.120" id="596BC614-8653-43CC-925B-E56CFF6DB8CF"><query xmlns="http://jabber.org/protocol/disco#items"/></iq>

RECV:

<iq xmlns="jabber:client" type="result" id="596BC614-8653-43CC-925B-E56CFF6DB8CF" from="192.168.2.120" to="jsojitra@192.168.2.120/4a0ce4e9"><query xmlns="http://jabber.org/protocol/disco#items"><item jid="conference.192.168.2.120" name="Public Chatrooms"/><item jid="pubsub.192.168.2.120" name="Publish-Subscribe service"/><item jid="proxy.192.168.2.120" name="Socks 5 Bytestreams Proxy"/></query></iq>

发送:

<iq type="get" to="proxy.192.168.2.120" id="03078D21-008A-444C-87D4-FCC370D16E5D"><query xmlns="http://jabber.org/protocol/disco#info"/></iq>

RECV:

<iq xmlns="jabber:client" type="result" id="03078D21-008A-444C-87D4-FCC370D16E5D" from="proxy.192.168.2.120" to="jsojitra@192.168.2.120/4a0ce4e9"><query xmlns="http://jabber.org/protocol/disco#info"><identity category="proxy" name="SOCKS5 Bytestreams Service" type="bytestreams"/><feature var="http://jabber.org/protocol/bytestreams"/><feature var="http://jabber.org/protocol/disco#info"/></query></iq>

发送:

<iq type="get" to="proxy.192.168.2.120" id="C537E4CC-AD48-4517-85D7-96D6DF1658F4"><query xmlns="http://jabber.org/protocol/bytestreams"/></iq>

RECV:

<iq xmlns="jabber:client" type="result" id="C537E4CC-AD48-4517-85D7-96D6DF1658F4" from="proxy.192.168.2.120" to="jsojitra@192.168.2.120/4a0ce4e9"><query xmlns="http://jabber.org/protocol/bytestreams"><streamhost jid="proxy.192.168.2.120" host="192.168.2.120" port="7777"/></query></iq>

发送:

<iq type="set" to="spatil@192.168.2.120" id="A791E4C0-3235-402F-A537-94FB296BA0C4"><query xmlns="http://jabber.org/protocol/bytestreams" sid="A791E4C0-3235-402F-A537-94FB296BA0C4" mode="tcp"><streamhost xmlns="http://jabber.org/protocol/bytestreams" jid="proxy.192.168.2.120" host="192.168.2.120" port="7777"/></query></iq>

RECV:

<iq xmlns="jabber:client" type="error" id="A791E4C0-3235-402F-A537-94FB296BA0C4" from="spatil@192.168.2.120" to="jsojitra@192.168.2.120/4a0ce4e9"><query xmlns="http://jabber.org/protocol/bytestreams" sid="A791E4C0-3235-402F-A537-94FB296BA0C4" mode="tcp"><streamhost jid="proxy.192.168.2.120" host="192.168.2.120" port="7777"/></query><error code="503" type="cancel"><service-unavailable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq>

任何机构都可以建议我发生这个问题的错误可能是什么?

我已完成以下配置以启用文件传输。

从 Openfire 启用文件传输。 Server -&gt; Server Settings -&gt; File Transfer Settings -&gt; Enable on port number 7777

在 Openfire 中设置以下服务器属性。

xmpp.domain             192.168.2.120
xmpp.proxy.enabled      true
xmpp.proxy.externalip   192.168.2.120 / proxy.192.168.2.120 // Tried both
xmpp.proxy.port         7777

如果您有任何想法,我请求您提供帮助。

提前致谢!!!

【问题讨论】:

  • 嘿伙计!看起来您没有使用资源传递正确的 JID。带有资源的完整 JID 看起来像 jsojitra@192.168.2.120/4a0ce4e9。

标签: ios xmpp file-transfer xmppframework


【解决方案1】:

看起来您没有通过资源传递正确的 JID。 具有资源的完整 JID 类似于 jsojitra@192.168.2.120/4a0ce4e9。 最后一个特殊的“4a0ce4e9”是资源,应该在 JID 中往返。

你应该有

from="spatil@192.168.2.120/someResourceId"

to="jsojitra@192.168.2.120/4a0ce4e9

【讨论】:

  • 我已经尝试在 from 和 to 中使用完整的资源 ID,但仍然存在一些问题并显示相同的错误。
  • 我已经在下面的链接上上传了最新的代码,你可以看看吗? goo.gl/h5x675如果我们能解决问题
  • 好的。伙计让我检查一下。
  • 嘿!Jayesh 我向您发送了我的应用程序委托。我已根据我用于传输图像的用途修改了应用程序委托。我已在我的应用程序委托中合并了 XMPPSIFiletranfer 所有方法。只需在以下数学中传递数据 -(void)sendToOtherDevice:(NSData )fileData receiverJid:(NSString *)receiverJid file:(NSString *)fileName 并在 appdelegate file.ie - (void)receivedImage 中处理 XMPPSiFiletranfer 的委托方法: (NSData)图像来自:(XMPPJID*)来自{
  • 从这里获取 appDelegates 文件 dropbox.com/s/t0lyml945qclw76/Archive%202.zip?dl=0
【解决方案2】:

您可以使用文件传输扩展来发送文件。你可以参考 GitHub 上的XMPP File Transfer Demo。还有使用它进行文件传输的示例应用程序。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,我研究了这节并以这种方式解决了。

    很多人使用 "/Smack""/Resource" 作为 jid 中的资源部分,这没有错,但您可以通过其他方式设置资源。

    就像 Arpan Dixit 解释的那样,资源路径会随着用户的每次改变而改变。假设我们要向该用户发送图像: “user1@mydomain”

    您必须将 "/Resource" 部分添加到此 jid 中,它变为: user1@mydomain/资源

    但是 /Resource 路径会随着存在而改变,因此您必须遵循每一个存在变化来更新资源路径。 最好的方法是让用户存在是在名册监听器中,在 presencheChanged() 方法中你得到最后一个用户资源部分,如下所示:

    Roster roster=getRoster();
    roster.addRosterListener(new RosterListener() {
                    @Override
                    public void entriesAdded(Collection<Jid> addresses) {
                        Log.d("entriesAdded", "ug");
                        context.sendBroadcast(new Intent("ENTRIES_ADDED"));
                    }
    
                    @Override
                    public void entriesUpdated(Collection<Jid> addresses) {
                        Log.d("entriesUpdated", "ug");
                    }
    
                    @Override
                    public void entriesDeleted(Collection<Jid> addresses) {
                        Log.d("entriesDeleted", "ug");
                    }
    
                    @Override
                    public void presenceChanged(Presence presence) {
                        Log.d("presenceChanged", "ug");
                        //Resource from presence
                        String resource = presence.getFrom().getResourceOrEmpty().toString();
                        //Update resource part for user in DB or preferences
                        //...
                    }
                });
    }
    

    资源字符串将是一些生成的字符串,如“6u1613j3kv”,jid 将变为:

    user1@mydomain/6u1613j3kv
    

    这意味着您必须像这样创建传出传输:

    EntityFullJid jid = JidCreate.entityFullFrom("user1@mydomain/6u1613j3kv"); 
    OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(jid)
    transfer.sendFile(new File("DirectoryPath"), "Description");
    

    当然,此代码是来自 Android 的示例,但对于您在 iOS 上的应用程序也是如此。

    这也可以很容易地配置,只需将资源设置为

    XMPPTCPConnectionConfiguration.Builder //android 示例。

    喜欢

    XMPPTCPConnectionConfiguration.Builder configurationBuilder = 
    XMPPTCPConnectionConfiguration.builder(); 
    
    configurationBuilder.setResource("yourResourceName");
    

    【讨论】:

      【解决方案4】:

      我的程序一开始运行良好,后来又出现了同样的问题。我的问题是离线消息容量超过了我的openfire服务器中的预设值。我查看了我的openfire服务器,在“服务器设置”中找到了一个名为“离线消息策略”的项目,我扩展了单用户离线消息存储容量。然后应用就可以正常工作了。

      【讨论】:

        猜你喜欢
        • 2012-04-29
        • 2015-01-14
        • 2013-07-29
        • 1970-01-01
        • 2015-09-27
        • 1970-01-01
        • 2021-01-07
        • 1970-01-01
        相关资源
        最近更新 更多