簡體   English   中英

文件傳輸不工作smack 4.1 android

[英]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”。 那是我可以成功發送普通郵件的收件人。

我從Smack得到的錯誤代碼:

錯誤503-服務不可用

發送文件后,我直接從smack收到此錯誤響應,似乎文件未傳輸,因為接收方偵聽器未顯示任何內容(我在發送和接收時都進行了日志記錄),但是偵聽器肯定已注冊。 但是我完全確定,服務器支持文件傳輸,它在其網站www.coderollers.com上聲明。 我在SO和Smack開發人員社區中都讀過很多關於這里的問題。 沒有任何幫助,所以我的問題是:

  1. 可能是這個問題的原因?
  2. 可能是因為我必須更換端口嗎?
  3. 如何在smack中更改現有連接的端口?
  4. 文件傳輸有其他選擇嗎?

我的普通端口是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM