2013-07-29 56 views
1

現在我正在使用Android中的Xmpp文件傳輸。在發送文件時,它會提供503服務不可用錯誤。Android中的Xmpp FileTransnfer提供503服務不可用錯誤

> 07-29 15:33:12.183: D/SMACK(22151): 03:33:12 PM SENT (1095973320): 
> <iq id="s9DTB-10" to="[email protected]/Smack" 
> from="[email protected]/Smack" type="set"><si 
> xmlns="http://jabber.org/protocol/si" id="jsi_6388535575928662640" 
> mime-type="image/jpeg" 
> profile="http://jabber.org/protocol/si/profile/file-transfer"><file 
> xmlns="http://jabber.org/protocol/si/profile/file-transfer" 
> name="IMG_20130715_115622_1445552069.jpg" size="2105955" 
> ><desc>test_file</desc></file><feature xmlns="http://jabber.org/protocol/feature-neg"><x 
> xmlns="jabber:x:data" type="form"><field var="stream-method" 
> type="list-single"><option><value>http://jabber.org/protocol/bytestreams</value></option><option><value>http://jabber.org/protocol/ibb</value></option></field></x></feature></si></iq> 

之後,它給像使用

> 07-29 15:33:12.708: D/SMACK(22151): 03:33:12 PM RCV (1095973320): <iq 
> from='[email protected]/Smack' to='[email protected]/Smack' 
> type='error' id='s9DTB-10'><error code='503' 
> type='cancel'><service-unavailable 
> xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/></error></iq> 

上午asmack-Android的6-0.8.1.1.jar

請幫我一個迴應,爲什麼這503錯誤發生。

+0

您是否爲支持做過服務發現?它是否支持文件傳輸返回正確的結果?此外,請執行以下操作:http://stackoverflow.com/questions/11712671/smack-no-response-from-server-not-sure-why-am-i-getting-this-error –

+0

無法使用服務的IQ錯誤不是由缺少服務發現信息引起的。 – Flow

+0

@ skyblueandroid007:嗨,你是否解決了這個問題.. 我也有同樣的問題。如果知道解決方案,請讓我知道。 – Raj

回答

0

將服務發現添加到您的代碼中。您可以使用下面的代碼進行文件傳輸。

ServiceDiscoveryManager sdm = ServiceDiscoveryManager 
      .getInstanceFor(kXmppConnection); 
    if (sdm == null) 
     sdm = new ServiceDiscoveryManager(XmppConnection); 
    sdm.addFeature("http://jabber.org/protocol/disco#info"); 
    sdm.addFeature("jabber:iq:privacy"); 
    FileTransferNegotiator.setServiceEnabled(kXmppConnection, 
      true); 
    FileTransferManager manager = new FileTransferManager(
      kXmppConnection); 

    final OutgoingFileTransfer transfer = manager 
      .createOutgoingFileTransfer(jid + "/Smack"); 
    File file = new File(file_path); 
    try { 
     transfer.sendFile(file, "test_file"); 
    } catch (XMPPException e) { 
     e.printStackTrace(); 

    } 
    new AsyncTask<Void, Void, Void>() { 


     protected void onPreExecute() { 

     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      while (!transfer.isDone()) { 
       if (transfer.getStatus().equals("Error")) { 
        Log.d("file transfer", 
          "ERROR!!! " + transfer.getError()); 

       } else if (transfer.getStatus().equals("Cancelled") 
         || transfer.getStatus().equals("Refused")) { 
        Log.d("file transfer", 
          "Cancelled!!! " + transfer.getError()); 
       } 
       try { 
        Thread.sleep(1000L); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
      return null; 
     }; 

     protected void onPostExecute(Void result) { 

      if (transfer.getStatus().equals("Refused") 
        || transfer.getStatus().equals("Error") 
        || transfer.getStatus().equals("Cancelled")) { 
       Log.i("file transfer", "refused cancelled error " 
         + transfer.getError()); 

      } else { 

       Log.i("file transfer", "Success: " + transfer.getFileName()); 
      } 
     }; 
    }.execute(); 
0

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

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

資源路徑隨着用戶的每個在場變化而改變。比方說,我們要發送圖片到該用戶: 「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("[email protected]/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和4.2.2啪。

相關問題