2017-07-11 12 views
2

我試圖使用smack擴展庫4.2.0傳輸文件,但無法成功傳輸文件。當我嘗試傳輸文件,這是我收到無法使用smack傳輸文件'XMPPError:service-unavailable - cancel'

org.jivesoftware.smack.XMPPException$XMPPErrorException: XMPP error reply received from [email protected]/Smack: XMPPError: service-unavailable - cancel 

即使對00006在線的錯誤,但我不知道爲什麼我從同行

接收錯誤這是我的代碼傳輸文件

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"); 
     } 

任何幫助和指導是非常讚賞

編輯:我的用戶SP ark客戶端使用我的服務器傳輸文件,它可靠地傳輸文件。所以問題不在於服務器我在客戶端的代碼中。

回答

0

我有同樣的問題,我調查了節並以這種方式解決了它。

許多人使用「/啪」「/資源」作爲資源部分JID,但這是錯誤的。

資源路徑隨着用戶的每個在場變化而改變。比方說,我們要發送圖片到該用戶: 「USER1 @ MYDOMAIN」

必須「/資源」或「/啪」添加一部分,這個JID,它成爲本: USER1 @ MYDOMAIN /資源

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("[email protected]/6u1613j3kv"); 
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(jid) 

你的情況是這樣的:

EntityBareJid jid = JidCreate.entityBareFrom(sendTo); 
EntityFullJid entityFullJid = JidCreate.entityFullFrom(jid + resource); 

resource從存在於聽者resourcepart。

這就是我已經解決了我與smack和Openfire文件傳輸問題。

另外提一下,您必須在您的Openfire服務器添加以下屬性:

xmpp.proxy.enabled - true 
xmpp.proxy.externalip - MY_IP_ADDRESS 
xmpp.proxy.port -7777 

就更不用說了,我使用的Openfire 4.0.2和4.2.2啪。