【问题标题】:How to handle IllegalStateException in file transfer using Smack library?如何使用 Smack 库处理文件传输中的 IllegalStateException?
【发布时间】:2014-07-02 05:35:11
【问题描述】:

我正在使用 asmack-jse-buddycloud-2010 库制作一个聊天应用程序。通过使用它,我能够进行聊天和文件传输,但在测试 1 个场景时,传输文件(假设文件大小 > 1MB 或任意大小)在这种情况下,要么服务器出现故障,要么我们失去了互联网连接,应用程序通过抛出异常而崩溃

错误日志:

  07-02 13:09:05.983: E/AndroidRuntime(12913): FATAL EXCEPTION: File Transfer jsi_555743874184501198
07-02 13:09:05.983: E/AndroidRuntime(12913): Process: com.example.chat_demo, PID: 12913
07-02 13:09:05.983: E/AndroidRuntime(12913): java.lang.IllegalStateException: Not connected to server.
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smack.XMPPConnection.sendPacket(XMPPConnection.java:488)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.packet.SyncPacketSend.getReply(SyncPacketSend.java:41)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.packet.SyncPacketSend.getReply(SyncPacketSend.java:61)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession$IQIBBOutputStream.writeToXML(InBandBytestreamSession.java:763)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession$IBBOutputStream.flushBuffer(InBandBytestreamSession.java:707)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession$IBBOutputStream.closeInternal(InBandBytestreamSession.java:737)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession.closeByLocal(InBandBytestreamSession.java:191)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession.close(InBandBytestreamSession.java:153)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession$IQIBBOutputStream.writeToXML(InBandBytestreamSession.java:768)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession$IBBOutputStream.flushBuffer(InBandBytestreamSession.java:707)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession$IBBOutputStream.writeOut(InBandBytestreamSession.java:679)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession$IBBOutputStream.write(InBandBytestreamSession.java:641)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession$IBBOutputStream.write(InBandBytestreamSession.java:644)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.filetransfer.FileTransfer.writeToStream(FileTransfer.java:217)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer$2.run(OutgoingFileTransfer.java:231)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at java.lang.Thread.run(Thread.java:811)

我试图捕捉这个异常,但应用程序仍然崩溃并出现相同的异常 任何帮助将不胜感激。

这是我的代码

    File file ;

    configureProviderManager(connection);

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




String to = connection.getRoster().getPresence(to).getFrom();


                         transfer = manager.createOutgoingFileTransfer(to);

                 try {

                            configureProviderManager(connection);
            //here file trasfer occur's .parameters are file and filename(has nothing to do with transfer)

                           transfer.sendFile(file,file.getName().tostring());

                    } catch (IllegalStateException e) {

                            Log.i("illegal state exception","caught  ");
                            //transfer.cancel();
                        }catch (XMPPException e) {

                               e.printStackTrace();
                               }

                 while(!transfer.isDone()) {
                            if (transfer.getStatus() == Status.error) {

                                    transfer.cancel();
                            }


                            if(transfer.getStatus().equals(Status.refused))
                            System.out.println("refused  " + transfer.getError());
                            else if( transfer.getStatus().equals(Status.error))

                                 System.out.println(" error " + transfer.getError());
                                 } 
                            if(transfer.getStatus().equals(Status.cancelled)){

                             System.out.println(" cancelled  " + transfer.getError());
                             }

                            else


                            System.out.println("Success");

                            }


                        }

    }

【问题讨论】:

  • 您能提供完整的堆栈跟踪吗?还有发生异常的代码行。
  • @Sanjeev 请立即查看帖子..我编辑了“错误日志”...由于传输线时连接关闭而发生异常:“transfer.sendFile(file,”"+file.getName() );"
  • 变量transfer 持有什么?
  • 是“OutgoingFileTransfer transfer;”的对象
  • 能否提供完整代码?

标签: java android chat smack illegalstateexception


【解决方案1】:

在发送文件之前尝试检查 XMPPConnection 的状态:

if(connection.isConnected()){
     transfer.sendFile(file,file.getName().tostring());
} else {
     // message to the user
}

希望对你有帮助。

【讨论】:

  • 感谢您的建议。但是尝试可视化场景..假设连接在那里并且这个函数 sendFile() 被执行并且进程进入了线程。现在文件大小以 MB 为单位,因此传输需要时间,这意味着现在库中的连接丢失(XAMPPConnection.java)有一个名为 SendPacket() 的函数,它在其中检查连接,如 if(!isConnected){ 抛出新的非法状态异常} .希望您挖掘更多以可视化问题..检查日志跟踪
  • 是的,我一直挖到那个地方,你自己对这种情况无能为力。您需要向 smack 创作者寻求帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
  • 2015-10-01
相关资源
最近更新 更多