首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用iOS的XMPP中传输文件时出现服务不可用的503错误

在使用iOS的XMPP中传输文件时出现服务不可用的503错误
EN

Stack Overflow用户
提问于 2014-10-08 14:33:31
回答 4查看 2.8K关注 0票数 1

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

我使用以下几行代码来发送文件。但我不断地得到一个错误和卡住的问题。

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

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

代码语言:javascript
复制
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()];

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

发送:

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

接收:

代码语言:javascript
复制
<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>

发送:

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

接收:

代码语言:javascript
复制
<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>

发送:

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

接收:

代码语言:javascript
复制
<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>

发送:

代码语言:javascript
复制
<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>

接收:

代码语言:javascript
复制
<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中设置以下服务器属性。

代码语言:javascript
复制
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

如果你有任何想法,我请求你的帮助。

提前感谢!

EN

回答 4

Stack Overflow用户

发布于 2014-10-08 21:51:08

看起来你没有向资源传递正确的JID。包含资源的完整JID类似于jsojitra@192.168.2.120/4a0ce4e9。最后一个特殊"4a0ce4e9“是资源,它应该在目标和来源的JID中。

你应该有

From=“spatil@192.168.2.120/某些资源”

to="jsojitra@192.168.2.120/4a0ce4e9

票数 2
EN

Stack Overflow用户

发布于 2014-11-06 20:21:30

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

票数 1
EN

Stack Overflow用户

发布于 2018-02-16 05:23:45

我也有同样的问题,我调查了节,并用这种方法解决了它。

许多人在jid中使用"/Smack""/Resource"作为资源部分,这没有错,但您可以用另一种方式设置资源。

就像Arpan解释的那样,资源路径随着用户的每次在线状态的改变而改变。假设我们想要向这个用户发送图像:"user1@mydomain"

您必须将"/Resource"部件添加到此jid中,它将变为以下形式:jid

但是/Resource路径会随着在线状态的变化而变化,因此您必须遵循每个在线状态的变化来更新资源路径。获取用户状态的最好方法是在花名册侦听器中,在presencheChanged()方法中,您可以获得最后一个用户资源部分,如下所示:

代码语言:javascript
复制
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将变为:

代码语言:javascript
复制
user1@mydomain/6u1613j3kv

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

代码语言:javascript
复制
EntityFullJid jid = JidCreate.entityFullFrom("user1@mydomain/6u1613j3kv"); 
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(jid)
transfer.sendFile(new File("DirectoryPath"), "Description");

当然,这段代码是来自Android的示例,但它与iOS上的应用程序是一样的。

这也可以通过简单的方式进行配置,只需将资源设置为

XMPPTCPConnectionConfiguration.Builder //android示例。

喜欢

代码语言:javascript
复制
XMPPTCPConnectionConfiguration.Builder configurationBuilder = 
XMPPTCPConnectionConfiguration.builder(); 

configurationBuilder.setResource("yourResourceName");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26250533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档