2017-11-06 7 views
0

ファイルを転送したいと思います。 Smack Apiを使ったOpenfireの画像やビデオ。
しかし、エラーコード503が毎回利用できなくなっています。
私のコーディングはSmack APIを使用してOpenfrieでファイルを転送するとエラーが発生する

public void onConnectionEstablished(){ 
    fileTransferManager = FileTransferManager.getInstanceFor(connection); 
    OutgoingFileTransfer.setResponseTimeout(30000); 
    addFileTransferListener(); 
} 


public void sendImage(File file, String to) throws SmackInvocationException { 
    if (fileTransferManager == null || !isConnected()) { 
     throw new SmackInvocationException("server not connected"); 
    } 

    EntityFullJid fullJid; 



    OutgoingFileTransfer transfer = fileTransferManager.createOutgoingFileTransfer(getFullJid(to)); 

    try { 

     transfer.sendFile(file, file.getName()); 
    } catch (Exception e) { 
     Log.e(LOG_TAG, "send file error"); 
     throw new SmackInvocationException(e); 
    } 

    while(!transfer.isDone()) { 
     if(transfer.getStatus().equals(FileTransfer.Status.refused) || transfer.getStatus().equals(FileTransfer.Status.error) 
       || transfer.getStatus().equals(FileTransfer.Status.cancelled)){ 
      throw new SmackInvocationException("send file error, " + transfer.getError()); 
     } 
    } 

    Log.d(LOG_TAG, "send file status: " + transfer.getStatus()); 
    if(transfer.getStatus().equals(FileTransfer.Status.refused) || transfer.getStatus().equals(FileTransfer.Status.error) 
      || transfer.getStatus().equals(FileTransfer.Status.cancelled)){ 
     throw new SmackInvocationException("send file error, " + transfer.getError()); 
    } 
} 

private void addFileTransferListener() { 

    fileTransferManager.addFileTransferListener(new FileTransferListener() { 
     public void fileTransferRequest(final FileTransferRequest request) { 
      new Thread() { 
       @Override 
       public void run() { 


        IncomingFileTransfer transfer = request.accept(); 
        String fileName = String.valueOf(System.currentTimeMillis()); 
        File file = new File(FileUtils.getReceivedImagesDir(context), fileName + FileUtils.IMAGE_EXTENSION); 
        try { 
         transfer.recieveFile(file); 

        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        catch (SmackException e) { 
         Log.e(LOG_TAG, "receive file error", e); 
         return; 
        } 

        while (!transfer.isDone()) { 
         if(transfer.getStatus().equals(FileTransfer.Status.refused) || transfer.getStatus().equals(FileTransfer.Status.error) 
           || transfer.getStatus().equals(FileTransfer.Status.cancelled)){ 
          Log.e(LOG_TAG, "receive file error, " + transfer.getError()); 
          return; 
         } 
        } 
       } 
      }.start(); 
     } 
    }); 
} 

マイログ

<iq type="error" id="Z6hyN-147" from="[email protected]/smack" to="[email protected]/smack"><si xmlns="http://jabber.org/protocol/si" id="jsi_1095486335648182993" mime-type="image/jpeg" profile="http://jabber.org/protocol/si/profile/file-transfer"><file xmlns="http://jabber.org/protocol/si/profile/file-transfer" name="1509942029217.jpg" size="830807"><desc>1509942029217.jpg</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><error code="503" type="cancel"><service-unavailable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq> 


一つのこと、私は、ユーザーの送信者と受信者の両方が同じネットワーク上にある場合ということが観察されていますエラーが発生しません。

Openfireサーバーには以下のファイル転送設定があります。その意味と構成方法はわかりません。

enter image description here

私はstackoverflowのが、私が持っていない答えに質問をたくさん見てきました。
助けてください。ありがとう

+0

ログファイル –

+0

あなたは誰でもそのログを読むと思いますか?なぜあなたは私たちに30分スクロールさせるのですか?スクロールする必要がないように投稿してください。 – greenapps

+0

質問を編集しました...あなたが助けてくれたら教えてください...また、私に知らせてください。受取人がオフラインの場合にopenfireがファイルを送ることができます –

答えて

0

私は同じ問題を抱えていましたが、私はこの節を調べてこのように解決しました。

多くの人々は、JIDにリソース一環として「/スマック」または「/リソース」を使用しますが、それは間違っています。

ユーザーのプレゼンスが変更されるたびにリソースパスが変更されています。 「USER1する@ MYDOMAIN」

あなたは、このJIDに「/リソース」または「/スマック」の部分を追加する必要があり、それがこのなる: USER1 @ MYDOMAIN /私たちは、このユーザーに画像を送信したいとしましょうリソース

ただし、リソースパスはプレゼンスとともに変更されているため、リソースパスを更新するためには、すべてのプレゼンス変更に従わなければなりません。

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 
        //... 
       } 
      }); 
} 

リソースstring 「6u1613j3kv」とJIDのようないくつかの生成された文字列になります。 ベストな方法は、あなたがこのような最後のユーザリソースの一部を取得する方法)は、ユーザの存在は(名簿リスナーにとpresencheChangedであり得ることですなる: MYDOMAIN/6u1613j3kv @ user1の

あなたはこのようなあなたの送出移送を作成しなければならないことを意味:

EntityFullJid jid = JidCreate.entityFullFrom("[email protected]/6u1613j3kv"); 
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(jid) 

あなたの場合: 文字列to = "user1 @ mydomain/6u1613j3kv"; EntityFullJid fullJid = JidCreate.entityFullFrom(to); OutgoingFileTransfer transfer = fileTransferManager.createOutgoingFileTransfer(fullJid);

6u1613j3kv存在感の変化ごとに文字列が生成されます。

そして、それは私がスワックとOpenfireのファイル転送に関する私の問題を解決した方法です。

また、あなたがあなたのOpenfireサーバで次のプロパティを追加する必要があります言及する:

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

だけ言及し、私はOpenfire 4.0.2とスマック4.2.2を使用しています。

関連する問題