使用iOS的XMPP中的文件传输服务不可用503错误

时间:2014-10-08 06:33:31

标签: ios xmpp file-transfer xmppframework

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

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

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

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

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 -> Server Settings -> File Transfer Settings -> 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

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

提前致谢!!!

4 个答案:

答案 0 :(得分:2)

看起来你没有用资源传递正确的JID。 具有资源的完整JID类似于jsojitra@192.168.2.120/4a0ce4e9。 最后一个特殊的“4a0ce4e9”是JID往返的资源。

你应该

这= “spatil@192.168.2.120/someResourceId”

要=“jsojitra@192.168.2.120/4a0ce4e9

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我有同样的问题,我调查了这一节并以这种方式解决了。

很多人使用“/ Smack”“/ Resource”作为jid中的资源部分,这没有错,但你可以用另一种方式设置资源。

像Arpan Dixit解释的那样,资源路径随着用户的每次改变而变化。让我们说我们想要向这个用户发送图像: 的 “USER1 @ MYDOMAIN”

您必须将“/资源”部分添加到此jid中,它将变为: 的 USER1 @ MYDOMAIN /资源

/资源路径随着状态而变化,因此您必须按照每次状态更改来更新资源路径。 最好的方法是让用户出现在名册监听器中,并在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");

答案 3 :(得分:0)

我的程序起初运行良好,后来又出现了相同的问题。我的问题是脱机邮件容量超过了我的openfire服务器中的预设值。我检查了openfire服务器,并在“服务器设置”中找到了一个名为“脱机邮件策略”的项目,我扩展了单用户的脱机邮件存储容量。然后该应用程序可以正常运行。