我正在使用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>接收:
<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>接收:
<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>接收:
<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>接收:
<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如果你有任何想法,我请求你的帮助。
提前感谢!
发布于 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
发布于 2014-11-06 20:21:30
您可以使用文件传输扩展名来发送文件。你可以在GitHub上参考XMPP File Transfer Demo。还有使用它进行文件传输的示例应用程序。
发布于 2018-02-16 05:23:45
我也有同样的问题,我调查了节,并用这种方法解决了它。
许多人在jid中使用"/Smack"或"/Resource"作为资源部分,这没有错,但您可以用另一种方式设置资源。
就像Arpan解释的那样,资源路径随着用户的每次在线状态的改变而改变。假设我们想要向这个用户发送图像:"user1@mydomain"
您必须将"/Resource"部件添加到此jid中,它将变为以下形式:jid
但是/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");https://stackoverflow.com/questions/26250533
复制相似问题