我正在使用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
如果您有任何想法,我会请求您提供帮助。
提前致谢!!!
答案 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服务器,并在“服务器设置”中找到了一个名为“脱机邮件策略”的项目,我扩展了单用户的脱机邮件存储容量。然后该应用程序可以正常运行。