我正在尝试使用 smack 扩展库 4.2.0 传输文件,但无法成功传输文件。当我尝试传输文件时,这是我遇到的错误
org.jivesoftware.smack.XMPPException$XMPPErrorException: XMPP error reply received from 252615100006@server/Smack: XMPPError: service-unavailable - cancel
即使 peer 00006 在线,但我不知道为什么我从 peer 收到错误
这是我传输文件的代码
public void sendImageMessage(String sendTo, String imagePath) throws XmppStringprepException {
FileTransferManager manager = FileTransferManager.getInstanceFor(mConnection);
EntityBareJid jid = JidCreate.entityBareFrom(sendTo);
EntityFullJid entityFullJid = JidCreate.entityFullFrom(jid+"/Smack");
Domainpart domainpart = entityFullJid.getDomain();
// Log.d(TAG ," JID Domain "+entityFullJid.do)
OutgoingFileTransfer outgoingFileTransfer = manager.createOutgoingFileTransfer(entityFullJid);
File file = new File(imagePath);
try {
outgoingFileTransfer.sendFile(file, file.getName());
} catch (SmackException e) {
e.printStackTrace();
}
while (!outgoingFileTransfer.isDone()) {
if (outgoingFileTransfer.getStatus().equals(FileTransfer.Status.error)) {
System.out.println("ERROR!!! " + outgoingFileTransfer.getError());
} else if (outgoingFileTransfer.getStatus().equals(FileTransfer.Status.cancelled)
|| outgoingFileTransfer.getStatus().equals(FileTransfer.Status.refused)) {
System.out.println("Cancelled!!! " + outgoingFileTransfer.getError());
}
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (outgoingFileTransfer.getStatus().equals(FileTransfer.Status.refused) || outgoingFileTransfer.getStatus().equals(FileTransfer.Status.error)
|| outgoingFileTransfer.getStatus().equals(FileTransfer.Status.cancelled)) {
System.out.println("refused cancelled error" + outgoingFileTransfer.getError().toString());
} else {
System.out.println("Successfully_SEND");
}
非常感谢任何帮助和指导
编辑: 我使用 spark 客户端使用我的服务器传输文件,它成功地传输了文件。所以问题不在于服务器,我认为它不在于客户端的代码。
最佳答案
我有同样的问题,我调查了节并以这种方式解决了它。
许多人使用 "/Smack"或 "/Resource" 作为 jid 中的资源部分,但这可以通过其他方式完成。
资源路径随着用户每次出现的变化而变化。假设我们要将图像发送给该用户: “user1@mydomain”
你必须添加“/Resource”或“/Smack”部分到这个jid,它变成这样: user1@mydomain/资源
user1@mydomain/Smack
但是资源路径随着在线状态而变化,因此您必须跟随每次在线状态变化来更新资源路径。 最好的方法是让用户出现在名册监听器中,并在 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)
你的情况是这样的:
EntityBareJid jid = JidCreate.entityBareFrom(sendTo);
EntityFullJid entityFullJid = JidCreate.entityFullFrom(jid + resource);
resource
是监听器中 Presence 的资源部分。
这就是我在 smack 和 Openfire 上解决文件传输问题的方法。
还要提一下,您必须在 Openfire 服务器中添加以下属性:
xmpp.proxy.enabled - true
xmpp.proxy.externalip - MY_IP_ADDRESS
xmpp.proxy.port -7777
顺便提一下,我使用的是 Openfire 4.0.2 和 Smack 4.2.2。
这也可以通过简单的方式进行配置,只需将资源设置为
XMPPTCPConnectionConfiguration.Builder .
喜欢
XMPPTCPConnectionConfiguration.Builder configurationBuilder =
XMPPTCPConnectionConfiguration.builder();
configurationBuilder.setResource("yourResourceName");
关于android - 使用 smack 'XMPPError: service-unavailable - cancel' 传输文件失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45031111/