Apache Commons Net FTPClient stops storing files

I am developing an applet for downloading FTP from a web application ...

The send operation works fine, but I would like to cancel saving the file.

I am not very fluent about streams. My first attempt was to call ftp.abort () on the cancel thread, but the abort method was only called when the storeFile method completed, for example, if the send stream blocked the ftp object.

So, I changed the code to interrupt the send stream and check it in the copy stream listener. Saving the file stops as expected, but the ftp.abort () call hangs with the application, it never ends.

Any ideas?

Thanks Philip

Send operation:

botaoEnviar.setEnabled(false); botaoCancelar.setEnabled(true); textField.requestFocus(); threadEnvio = new Thread(new Runnable() { @Override public void run() { FileInputStream fis = null; try { if(arquivoSelecionado == null) { throw new IllegalArgumentException("Arquivo deve ser informado"); } try { ftp = new FTPClient(); ftp.connect("192.168.1.243"); } catch(Exception e) { throw new FtpConnectionException("Não foi possível conectar no servidor FTP", e); } if(!ftp.login("c001", "0AJF2J36")) { throw new IllegalArgumentException("Não foi possível autenticar no servidor FTP"); } ftp.setFileType(FTPClient.BINARY_FILE_TYPE); ftp.setCopyStreamListener(new CopyStreamAdapter() { @Override public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) { if(threadEnvio.isInterrupted()) { try { ftp.abort(); } catch(IOException ex) { handleException(ex); } } else { int percent = (int) (totalBytesTransferred * 100 / arquivoSelecionado.length()); progressBar.setValue(percent); } } }); fis = new FileInputStream(arquivoSelecionado); if(ftp.storeFile(arquivoSelecionado.getName(), fis)) { JOptionPane.showMessageDialog(null, "Arquivo enviado com suceso"); } else { JOptionPane.showMessageDialog(null, "Não foi possível enviar o arquivo", "Erro", JOptionPane.ERROR_MESSAGE); } ftp.logout(); } catch(Exception e) { handleException(e); } finally { if(fis != null) { try { fis.close(); } catch(IOException ex) { handleException(ex); } } if(ftp != null) { try { ftp.disconnect(); } catch(IOException ex) { handleException(ex); } } progressBar.setValue(0); botaoEnviar.setEnabled(true); botaoCancelar.setEnabled(false); } } }); threadEnvio.start(); 

Cancel operation:

 botaoCancelar.setEnabled(false); new Thread(new Runnable() { @Override public void run() { try { threadEnvio.interrupt(); } catch(Exception ex) { handleException(ex); } finally { botaoCancelar.setEnabled(true); } } }).start(); 
+6
source share
1 answer

interrupting a stream like this is incorrect and causes the stream to wait a few seconds (or even milliseconds) exactly what line the compiler reads in your stream
the only way you can interrupt ftp downloads is to reduce downtime a bit and then abort the download and finally wait for the stream to finish
see this:

  try { try { Thread.currentThread(); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } try { mFTP.abort(); } catch (IOException e) { e.printStackTrace(); } } catch (NetworkOnMainThreadException e) { } 
0
source

Source: https://habr.com/ru/post/947304/


All Articles