我正在尝试使用服务器上的openfire和smack java库通过聊天发送文件。
这是我得到的输出:
状态::错误错误:: null异常:: service-unavailable(503)是 它完成了吗?真
以下是我的发送方和接收方功能:
public void fileTransfer(String fileName, String destination) throws XMPPException {
// Create the file transfer manager
FileTransferManager manager = new FileTransferManager(connection);
FileTransferNegotiator.setServiceEnabled(connection,true);
// Create the outgoing file transfer
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(destination);
// Send the file
transfer.sendFile(new File(fileName), "You won't believe this!");
try {
Thread.sleep(10000);
}
catch(Exception e){}
System.out.println("Status :: " + transfer.getStatus() + " Error :: " + transfer.getError() + " Exception :: " + transfer.getException());
System.out.println("Is it done? " + transfer.isDone());
}
public void fileReceiver(final boolean accept, final String fileName) {
// Create the file transfer manager
final FileTransferManager manager = new FileTransferManager(connection);
// Create the listener
manager.addFileTransferListener(new FileTransferListener() {
public void fileTransferRequest(FileTransferRequest request) {
// broadcast something here. Wheather users want to accept file
// Check to see if the request should be accepted
if(accept) {
// Accept it
IncomingFileTransfer transfer = request.accept();
try {
transfer.recieveFile(new File(fileName));
System.out.println("File " + fileName + "Received Successfully");
//InputStream input = transfer.recieveFile();
} catch (XMPPException ex) {
Logger.getLogger(XmppManager.class.getName()).log(Level.SEVERE, null, ex);
}
} else {
// Reject it
request.reject();
}
}
});
}
答案 0 :(得分:1)
我有同样的问题,我调查了这一节并以这种方式解决了。
很多人使用" / Smack "或" /资源" 作为jid中的资源部分,但这可以通过其他方式完成。
资源路径随着用户的每次更改而变化。让我们说我们想要向这个用户发送图像: 的" USER1 @ MYDOMAIN" 强>
您必须将" /资源" 部分添加到此jid中,它将变为: 的 USER1 @ MYDOMAIN /资源强>
但 /资源路径随着状态而变化,因此您必须按照每次状态更改来更新资源路径。 最好的方法是让用户出现在名册监听器中,并在presencheChanged()方法中获得最后一个用户资源部分:
Qt5Core_DIR:PATH=C:/ProgramData/Anaconda3/Library/lib/cmake/Qt5Core
资源字符串将是一些生成的字符串,如" 6u1613j3kv"和jid将成为:
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
//...
}
});
}
这意味着您必须像这样创建传出转移:
user1@mydomain/6u1613j3kv
这就是我在smack和Openfire上解决文件传输问题的方法。
在您的情况下,jid是目的地。
另外,您必须在Openfire服务器中添加以下属性:
EntityFullJid jid = JidCreate.entityFullFrom("user1@mydomain/6u1613j3kv");
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(jid)
transfer.sendFile(new File("DirectoryPath"), "Description");
请注意,我使用的是Openfire 4.0.2和Smack 4.2.2。
这也可以通过简单的方式进行配置,只需在
上设置资源即可XMPPTCPConnectionConfiguration.Builder。
像
xmpp.proxy.enabled - true
xmpp.proxy.externalip - MY_IP_ADDRESS
xmpp.proxy.port - 7777