[英]File Transfer not working smack 4.1 android
目前,我正在玩新的Smack 4.1,它為android提供了全面的支持。 發送和接收消息沒問題,可以正常工作。 但是現在,我陷入了發送和接收文件的困境。 例如:
public void sendFile(String fileName,String to){
if(transferManager==null) {
transferManager = FileTransferManager.getInstanceFor(mConnection);
}
OutgoingFileTransfer transfer = transferManager.createOutgoingFileTransfer(to);
try {
transfer.sendFile(new File(fileName), "This is a Test!");
} catch (SmackException e) {
e.printStackTrace();
}
}
public void setReceiveFileListener(){
if(transferManager==null) {
transferManager = FileTransferManager.getInstanceFor(mConnection);
}
transferManager.addFileTransferListener(new FileTransferListener() {
@Override
public void fileTransferRequest(FileTransferRequest request) {
IncomingFileTransfer transfer = request.accept();
try {
File file = new File(Environment.getExternalStorageDirectory() + File.separator +"TEST"+File.separator+ "new.txt");
transfer.recieveFile(file);
} catch (SmackException | IOException e) {
e.printStackTrace();
}
}
});
}
在這種情況下,我只發送一個文本文件,並想將其另存為SD卡中的新文本文件,即“ new.txt”。 問題不在於文件本身,文件存在。 另外,接收者ID是正確的,就像“ user@host.com/Smack”。 那是我可以成功發送普通郵件的收件人。
錯誤503-服務不可用
發送文件后,我直接從smack收到此錯誤響應,似乎文件未傳輸,因為接收方偵聽器未顯示任何內容(我在發送和接收時都進行了日志記錄),但是偵聽器肯定已注冊。 但是我完全確定,服務器支持文件傳輸,它在其網站www.coderollers.com上聲明。 我在SO和Smack開發人員社區中都讀過很多關於這里的問題。 沒有任何幫助,所以我的問題是:
我的普通端口是5222,可以正常發送消息。 我希望有人能使它正常工作,並可以引導我朝正確的方向前進。...感謝您的幫助!
對於所有感興趣的人:Devendra Singh的回答是正確的,我自己做了一點說明。 使用哪種資源似乎很重要。 從移動設備到移動設備,您必須使用“移動設備” 。 無論是“ Smack”還是任何其他資源標識符都不能在這里工作。 因此,像這樣正確初始化OutgoingFileTransfer
很重要:
OutgoingFileTransfer oft = ftm1.createOutgoingFileTransfer
(XmppStringUtils.completeJidFrom(USER, SERV, "mobile"));//important resource "mobile"
經過認真研究,我知道了。
FileTransferManager ftm1 = FileTransferManager.getInstanceFor(connection);
FileTransferManager ftm2 = FileTransferManager.getInstanceFor(connection2);
ftm2.addFileTransferListener(new FileTransferListener() {
@Override
public void fileTransferRequest(FileTransferRequest request) {
IncomingFileTransfer ift = request.accept();
try {
InputStream is = ift.recieveFile();
ByteArrayOutputStream os = new ByteArrayOutputStream();
int nRead;
byte[] buf = new byte[1024];
while ((nRead = is.read(buf, 0, buf.length)) != -1) {
os.write(buf, 0, nRead);
}
os.flush();
dataReceived = os.toByteArray();
} catch (SmackException | IOException | XMPPErrorException e) {
e.printStackTrace();
}
if (Arrays.equals(dataToSend, dataReceived)) {
System.out.println("Received data matches send data. \\o/");
} else {
System.err.println("Recieved data DOES NOT match send data. :(");
}
}
});
OutgoingFileTransfer oft = ftm1.createOutgoingFileTransfer(XmppStringUtils.completeJidFrom(USER, SERV, "resourse"));
oft.sendStream(new ByteArrayInputStream(dataToSend), "hello.txt", dataToSend.length, "A greeting");
outerloop: while (!oft.isDone()) {
switch (oft.getStatus()) {
case error:
System.out.println("Filetransfer error: " + oft.getError());
break outerloop;
default:
System.out.println("Filetransfer status: " + oft.getStatus() + ". Progress: " + oft.getProgress());
break;
}
Thread.sleep(1000);
}
connection.disconnect();
connection2.disconnect();
Thread.sleep(1000);
}
一個連接正在發送文件,另一個連接正在接收這是工作代碼。
我遇到了同樣的問題,我調查了該節並以這種方式解決了。
許多人在jid中使用“ / Smack ”或“ / Resource”作為資源部分,但這可以通過另一種方式完成。
資源路徑隨着用戶的每次狀態更改而改變。 假設我們要向該用戶發送圖像: “ user1 @ mydomain”
您必須在此jid中添加“ / Resource”或“ / Smack”部分,並且它變為: user1 @ mydomain / 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)
在您的情況下,該資源部分是“移動的” 。 只需使用名冊偵聽器中存在的資源部分對其進行更改。
這就是我解決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");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.