Asmack 文件传输进度始终为 0.0

Posted

技术标签:

【中文标题】Asmack 文件传输进度始终为 0.0【英文标题】:Asmack file transfer progress always at 0.0 【发布时间】:2014-05-06 08:27:34 【问题描述】:

您好,我正在使用 asmack-android-19-0.8.10.jar 和 openfire 来开发文件传输。我提到了harryjoy.me,但我在发送文件时遇到问题,其中 transfer.getProgress() 总是返回 0.0。下面是日志文件。

发送文件:

05-06 15:42:35.669: D/SMACK(25533): 03:42:35 PM SENT (1103132248): 
<iq id="7dnrX-23" to="lala@kaoru-pc/Smack" from="lolo@kaoru-pc/Smack" type="set">
    <si xmlns="http://jabber.org/protocol/si" id="jsi_8243824082816759940" mime-type="image/jpeg" profile="http://jabber.org/protocol/si/profile/file-transfer">
        <file xmlns="http://jabber.org/protocol/si/profile/file-transfer" name="pic_1399362155598.jpg" size="94630" >
            <desc>lolo</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>

05-06 15:42:35.719: D/SMACK(25533): 03:42:35 PM RCV  (1103132248): 
<iq id="7dnrX-23" to="lolo@kaoru-pc/Smack" from="lala@kaoru-pc/Smack" type="result">
    <si xmlns="http://jabber.org/protocol/si">
        <feature xmlns="http://jabber.org/protocol/feature-neg">
            <x xmlns="jabber:x:data" type="submit">
                <field var="stream-method">
                    <value>http://jabber.org/protocol/bytestreams</value>
                    <value>http://jabber.org/protocol/ibb</value>
                </field>
            </x>
        </feature>
    </si>
</iq>

05-06 15:42:35.719: D/SMACK(25533): 03:42:35 PM SENT (1103132248): 
<iq id="7dnrX-24" to="lala@kaoru-pc/Smack" type="get">
    <query xmlns="http://jabber.org/protocol/disco#info"></query>
</iq>

05-06 15:42:40.713: D/SMACK(25533): 03:42:40 PM SENT (1103132248): 
<iq id="7dnrX-25" to="lala@kaoru-pc/Smack" type="set">
    <open xmlns="http://jabber.org/protocol/ibb" block-size="4096" sid="jsi_8243824082816759940" stanza="iq"/>
</iq>
05-06 15:42:40.744: D/SMACK(25533): 03:42:40 PM RCV  (1103132248): 
<iq id="7dnrX-25" to="lolo@kaoru-pc/Smack" from="lala@kaoru-pc/Smack" type="result"/>

05-06 15:42:40.754: D/SMACK(25533): 03:42:40 PM SENT (1103132248): 
<iq id="7dnrX-26" to="lala@kaoru-pc/Smack" type="set">
    <data xmlns="http://jabber.org/protocol/ibb" seq="0" sid="jsi_8243824082816759940">
        ** Some data **

05-06 15:42:45.758: D/SMACK(25533): 03:42:45 PM SENT (1103132248): 
<iq id="7dnrX-27" to="lala@kaoru-pc/Smack" type="set">
    <data xmlns="http://jabber.org/protocol/ibb" seq="0" sid="jsi_8243824082816759940">
        ** Some data **

05-06 15:42:50.763: D/SMACK(25533): 03:42:50 PM SENT (1103132248): 
<iq id="7dnrX-28" to="lala@kaoru-pc/Smack" type="set">
<close xmlns="http://jabber.org/protocol/ibb" sid="jsi_8243824082816759940"/></iq>

接收文件:

    05-06 04:53:06.409: D/SMACK(1324): 04:53:06 AM RCV  (1384483676): 
<iq id="0cxQ1-38" to="lala@kaoru-pc/Smack" from="lolo@kaoru-pc/Smack" type="set">
    <si xmlns="http://jabber.org/protocol/si" id="jsi_4342883008583481067" mime-type="image/jpeg" profile="http://jabber.org/protocol/si/profile/file-transfer">
        <file xmlns="http://jabber.org/protocol/si/profile/file-transfer" name="pic_1399351997548.jpg" size="93096"><desc>lolo</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>
05-06 04:53:06.413: D/SMACK(1324): 04:53:06 AM SENT (1384483676): 
<iq id="0cxQ1-38" to="lolo@kaoru-pc/Smack" from="lala@kaoru-pc/Smack" type="result">
<si xmlns="http://jabber.org/protocol/si">
    <feature xmlns="http://jabber.org/protocol/feature-neg">
        <x xmlns="jabber:x:data" type="submit">
            <field var="stream-method">
                <value>http://jabber.org/protocol/bytestreams</value>
                <value>http://jabber.org/protocol/ibb</value>
            </field>
        </x>
    </feature>
</si>
</iq>

05-06 04:53:06.429: D/SMACK(1324): 04:53:06 AM RCV  (1384483676): 
<iq id="0cxQ1-39" to="lala@kaoru-pc/Smack" type="get" from="lolo@kaoru-pc/Smack">
    <query xmlns="http://jabber.org/protocol/disco#info"/>
</iq>

05-06 04:53:11.433: D/SMACK(1324): 04:53:11 AM RCV  (1384483676): 
<iq id="0cxQ1-40" to="lala@kaoru-pc/Smack" type="set" from="lolo@kaoru-pc/Smack">
    <open xmlns="http://jabber.org/protocol/ibb" block-size="4096" sid="jsi_4342883008583481067" stanza="iq"/>
</iq>

05-06 04:53:11.441: D/SMACK(1324): 04:53:11 AM SENT (1384483676): 
<iq id="0cxQ1-40" to="lolo@kaoru-pc/Smack" from="lala@kaoru-pc/Smack" type="result">
</iq>

05-06 04:53:11.485: D/SMACK(1324): 04:53:11 AM RCV  (1384483676): 
<iq id="0cxQ1-41" to="lala@kaoru-pc/Smack" type="set" from="lolo@kaoru-pc/Smack">
<data xmlns="http://jabber.org/protocol/ibb" seq="0" sid="jsi_4342883008583481067">
** Some data **

05-06 04:53:16.545: D/SMACK(1324): 04:53:16 AM RCV  (1384483676): 
<iq id="0cxQ1-42" to="lala@kaoru-pc/Smack" type="set" from="lolo@kaoru-pc/Smack">
<data xmlns="http://jabber.org/protocol/ibb" seq="0" sid="jsi_4342883008583481067">      ** Some data **

05-06 04:53:16.545: D/SMACK(1324): 04:53:16 AM RCV  (1384483676): 
** Some data **</data></iq>

05-06 04:53:21.501: D/SMACK(1324): 04:53:21 AM RCV  (1384483676): 
<iq id="0cxQ1-43" to="lala@kaoru-pc/Smack" type="set" from="lolo@kaoru-pc/Smack">
    <close xmlns="http://jabber.org/protocol/ibb" sid="jsi_4342883008583481067"/>
</iq>

这是我从 transfer.getException 得到的错误代码,用于 sendFile();

05-07 09:08:01.917: D/Error(12587): chatRoom.java at line 892 : error writing to output stream: 
05-07 09:08:01.917: D/Error(12587):   -- caused by: java.io.IOException: Error while closing stream: No response from server.

**** 已更新 ****

Sender.java

try 
                    FileTransferManager manager = new FileTransferManager(OpenFireAuthenticateService.connection);
                    FileTransferNegotiator.getInstanceFor(OpenFireAuthenticateService.connection);
                    FileTransferNegotiator.setServiceEnabled(OpenFireAuthenticateService.connection,true);

                    // Create the outgoing file transfer
                    OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(userName+"@"+OpenFireAuthenticateService.serverName + "/Smack");

                    // Send the file                
                    transfer.sendFile(new File(path), OpenFireAuthenticateService.hostName.substring(0, OpenFireAuthenticateService.hostName.indexOf("@")));

                    while(!transfer.isDone()) 

                        if(transfer.getStatus().equals(org.jivesoftware.smackx.filetransfer.FileTransfer.Status.error)) 
                            Log.d("Error","chatRoom.java at line 879 : "+transfer.getError().toString());
                         else if (transfer.getStatus().equals(org.jivesoftware.smackx.filetransfer.FileTransfer.Status.cancelled)
                                            || transfer.getStatus().equals(org.jivesoftware.smackx.filetransfer.FileTransfer.Status.refused)) 
                               Log.d("Error","chatRoom.java at line 882 : "+transfer.getError().toString());
                        
                        try 
                            Log.d("TEST", "STATUS: " + transfer.getStatus().toString() + " SIZE: " + new File(path).length() + " PROGRESS: " + transfer.getProgress() + " StreamID : "+transfer.getStreamID());
                            Thread.sleep(1000L);
                         catch (InterruptedException e) 
                               Log.d("Error","chatRoom.java at line 887 : "+e.toString());
                        
                    

                    if(transfer.getStatus().equals(org.jivesoftware.smackx.filetransfer.FileTransfer.Status.refused)) 
                        Log.d("Error","chatRoom.java at line 946 : "+transfer.getException());
                    
                    else if(transfer.getStatus().equals(org.jivesoftware.smackx.filetransfer.FileTransfer.Status.error)) 
                        Log.d("Error","chatRoom.java at line 949 : "+transfer.getException());
                    
                    else if(transfer.getStatus().equals(org.jivesoftware.smackx.filetransfer.FileTransfer.Status.cancelled))
                        Log.d("Error","chatRoom.java at line 952 : "+transfer.getException());
                     else 
                                Log.d("TEST","Success");
                    

                 catch (XMPPException e) 
                    Log.d("Error","chatRoom.java at line 895 : "+e.toString());
                

Receiver.java

ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection);
                if (sdm == null)
                    sdm = ServiceDiscoveryManager.getInstanceFor(connection);
                
                sdm.addFeature("http://jabber.org/protocol/disco#info");
                sdm.addFeature("jabber:iq:privacy");
                sdm.addFeature("http://jabber.org/protocol/disco#items");

                FileTransferManager manager = new FileTransferManager(connection);
                FileTransferNegotiator.getInstanceFor(connection);
                FileTransferNegotiator.setServiceEnabled(connection,true);
                manager.addFileTransferListener(new ServiceFileTransferListener(context));

ServiceFileTransferListener.java

try                
                File f = new File(filePath);
                IncomingFileTransfer transfer = request.accept();

                transfer.recieveFile(f);
                while(!transfer.isDone()) 
                       try
                          Thread.sleep(1000);
                          Log.d("TEST", "STATUS: " + transfer.getStatus().toString() + " SIZE: " + f.length() + " Stream ID : " + transfer.getStreamID());
                       catch (Exception e) 
                          Log.e("Error", "ServiceFileTransferListener.java at line 61 : "+e.getMessage());
                       
                       if(transfer.getStatus().equals(Status.error)) 
                          Log.e("Error ", "ServiceFileTransferListener.java at line 72 : "+ transfer.getStatus());
                       
                       if(transfer.getException() != null) 
                          Log.e("Error","ServiceFileTransferListener.java at line 75 : "+transfer.getException().getStackTrace());
                       
                
                Log.d("TEST","Received : "+request.getFileName() + " from " +request.getRequestor() + " File Size : "+request.getFileSize());
                Log.d("TEST","Status : "+transfer.getStatus());
                groupChatName = request.getRequestor().substring(0, request.getRequestor().indexOf("@"));   
                msgHeader = request.getFileName().substring(0, 3);
                msgBody = request.getFileName();
                memberName = "from";

             
            catch(XMPPException e) 
                Log.d("Error","ServiceFileTransferListener.java at line 79 : "+ e.toString());
            

【问题讨论】:

你的xmpp文件发送问题解决了吗,如果解决了请发给我发送文件的假人 @nitesh 我通过使用旧版本的 asmack (asmack-jre-buddycloud-2012-12-11.jar) 解决了文件发送问题。参考我上面的问题(harryjoy.com) 我在调试时遇到服务不可用 503 这与我的服务器有关吗? XML 响应 检查您与服务器的连接,并按照说明进行操作。那么应该没问题。 【参考方案1】:

实现看起来有问题,例如

<feature xmlns="http://jabber.org/protocol/feature-neg">
        <x xmlns="jabber:x:data" type="submit">
            <field var="stream-method">
                <value>http://jabber.org/protocol/bytestreams</value>
                <value>http://jabber.org/protocol/ibb</value>
            </field>
        </x>
    </feature>

是错误的回复,因为 XEP-0095 说:

如果可以接受,接收者必须选择呈现的流之一 要使用的类型。

尝试仅使用一种流方法和/或向 Smack 提交错误报告。

【讨论】:

是的。我意识到,但随后发件人将使用 IBB 作为流类型。还是失败了。状态始终在进行中,进度始终为 0.0。之后我得到了上面显示的异常。知道是什么原因造成的吗? 感谢您指出这一点。填写为SMACK-561 你有同样的解决方案吗?我必须在哪里写代码?【参考方案2】:

首先,感谢您提供详细的问题。这样就很容易知道可能出了什么问题。虽然vitalyster 是正确的,但该节违反了规范,我认为这不是问题的原因。

看起来不对的是,我们没有看到携带数据元素的集合 IQ 的任何结果 IQ,即缺少 Example 7 in XEP-47 的节。这就是我所能提供的信息。我建议您使用调试器来查找根本原因。 很高兴 (a)Smack 是开源的

编辑:你打电话给SmackAndroid.init(Context) 就像 aSmacks README 告诉你的那样,或者不?

【讨论】:

是的。在创建连接之前,我已经包含了 SmackAndroid.init(getApplicationContext()) 。还要手动添加 IQProvider。你是什​​么意思抢调试器? ConnectionConfiguration..setDebuggerEnabled(true);?我也包括了这个 我尝试使用 asmack-jre-buddycloud-2012-12-11.jar 的版本,猜猜它是怎么工作的!怎么可能? @Flow,当然,当双方都使用 Smack 时,他们可以在不遵循规范的情况下以某种方式传输文件 :) 但是当另一方使用不同的库时,它的根问题。例如,我在该节之后收到“协商失败”错误,这就是我发现规范违规的原因。并非所有库都有详细的错误报告,当用户无法使用 Smack 发送/接收文件时,我们可以在 *** 上看到很多与文件传输相关的 Smack 问题。 @vitalyster 为什么旧的 asmack 可以工作,但不能用于新版本?我恢复到旧版本,但由于旧库导致我的应用程序崩溃的其他功能在其他功能上有一些错误。 @vitalyster Smack 有很多文件传输相关的问题是正确的。我通常认为这是由于 XMPP 文件传输的复杂性和大多数人无法理解的。但是,当然,我很高兴看到 Smack 违反规范的每一份报告。

以上是关于Asmack 文件传输进度始终为 0.0的主要内容,如果未能解决你的问题,请参考以下文章

aSmack XMPP 文件传输循环处于“进行中”状态

asmack android,无法传输文件

android asmack 注册 登陆 聊天 多人聊天室 文件传输

android asmack 注册 登陆 聊天 多人聊天室 文件传输XMPP协议简介

无法使用 Beem-Asmack 在 XMPP FileTransfer 中处理上传

命令远程传输文件