Mega Code Archive

 
Categories / Java / Network Protocol
 

Graphical Ftp client

import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.StringTokenizer; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.border.BevelBorder; import javax.swing.border.EmptyBorder; import sun.net.TelnetInputStream; import sun.net.ftp.FtpClient; public class FTPApp extends JFrame {   public static int BUFFER_SIZE = 10240;   protected JTextField userNameTextField = new JTextField("anonymous");   protected JPasswordField passwordTextField = new JPasswordField(10);   protected JTextField urlTextField = new JTextField(20);   protected JTextField fileTextField = new JTextField(10);   protected JTextArea monitorTextArea = new JTextArea(5, 20);   protected JProgressBar m_progress = new JProgressBar();   protected JButton putButton = new JButton("Put");   protected JButton getButton;   protected JButton fileButton = new JButton("File");   protected JButton closeButton = new JButton("Close");   protected JFileChooser fileChooser = new JFileChooser();      protected FtpClient ftpClient;   protected String localFileName;   protected String remoteFileName;   public FTPApp() {     super("FTP Client");     JPanel p = new JPanel();     p.setBorder(new EmptyBorder(5, 5, 5, 5));     p.add(new JLabel("User name:"));     p.add(userNameTextField);     p.add(new JLabel("Password:"));     p.add(passwordTextField);     p.add(new JLabel("URL:"));     p.add(urlTextField);     p.add(new JLabel("File:"));     p.add(fileTextField);     monitorTextArea.setEditable(false);     JScrollPane ps = new JScrollPane(monitorTextArea);     p.add(ps);     m_progress.setStringPainted(true);     m_progress.setBorder(new BevelBorder(BevelBorder.LOWERED, Color.white,         Color.gray));     m_progress.setMinimum(0);     JPanel p1 = new JPanel(new BorderLayout());     p1.add(m_progress, BorderLayout.CENTER);     p.add(p1);     ActionListener lst = new ActionListener() {       public void actionPerformed(ActionEvent e) {         if (connect()) {           Thread uploader = new Thread() {             public void run() {               putFile();               disconnect();             }           };           uploader.start();         }       }     };     putButton.addActionListener(lst);     putButton.setMnemonic('p');     p.add(putButton);     getButton = new JButton("Get");     lst = new ActionListener() {       public void actionPerformed(ActionEvent e) {         if (connect()) {           Thread downloader = new Thread() {             public void run() {               getFile();               disconnect();             }           };           downloader.start();         }       }     };     getButton.addActionListener(lst);     getButton.setMnemonic('g');     p.add(getButton);     lst = new ActionListener() {       public void actionPerformed(ActionEvent e) {         if (fileChooser.showSaveDialog(FTPApp.this) != JFileChooser.APPROVE_OPTION)           return;         File f = fileChooser.getSelectedFile();         fileTextField.setText(f.getPath());       }     };     fileButton.addActionListener(lst);     fileButton.setMnemonic('f');     p.add(fileButton);          lst = new ActionListener() {       public void actionPerformed(ActionEvent e) {         if (ftpClient != null)           disconnect();         else           System.exit(0);       }     };     closeButton.addActionListener(lst);     closeButton.setDefaultCapable(true);     closeButton.setMnemonic('g');     p.add(closeButton);     getContentPane().add(p, BorderLayout.CENTER);          fileChooser.setCurrentDirectory(new File("."));     fileChooser         .setApproveButtonToolTipText("Select file for upload/download");     WindowListener wndCloser = new WindowAdapter() {       public void windowClosing(WindowEvent e) {         disconnect();         System.exit(0);       }     };     addWindowListener(wndCloser);     setSize(720, 240);     setVisible(true);   }   public void setButtonStates(boolean state) {     putButton.setEnabled(state);     getButton.setEnabled(state);     fileButton.setEnabled(state);   }   protected boolean connect() {     monitorTextArea.setText("");     setButtonStates(false);     closeButton.setText("Cancel");     setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));     String user = userNameTextField.getText();     if (user.length() == 0) {       setMessage("Please enter user name");       setButtonStates(true);       return false;     }     String password = new String(passwordTextField.getPassword());     String sUrl = urlTextField.getText();     if (sUrl.length() == 0) {       setMessage("Please enter URL");       setButtonStates(true);       return false;     }     localFileName = fileTextField.getText();     // Parse URL     int index = sUrl.indexOf("//");     if (index >= 0)       sUrl = sUrl.substring(index + 2);     index = sUrl.indexOf("/");     String host = sUrl.substring(0, index);     sUrl = sUrl.substring(index + 1);     String sDir = "";     index = sUrl.lastIndexOf("/");     if (index >= 0) {       sDir = sUrl.substring(0, index);       sUrl = sUrl.substring(index + 1);     }     remoteFileName = sUrl;     try {       setMessage("Connecting to host " + host);       ftpClient = new FtpClient(host);       ftpClient.login(user, password);       setMessage("User " + user + " login OK");       setMessage(ftpClient.welcomeMsg);       ftpClient.cd(sDir);       setMessage("Directory: " + sDir);       ftpClient.binary();       return true;     } catch (Exception ex) {       setMessage("Error: " + ex.toString());       setButtonStates(true);       return false;     }   }   protected void disconnect() {     if (ftpClient != null) {       try {         ftpClient.closeServer();       } catch (IOException ex) {       }       ftpClient = null;     }     Runnable runner = new Runnable() {       public void run() {         m_progress.setValue(0);         putButton.setEnabled(true);         getButton.setEnabled(true);         fileButton.setEnabled(true);         closeButton.setText("Close");         FTPApp.this.setCursor(Cursor             .getPredefinedCursor(Cursor.DEFAULT_CURSOR));       }     };     SwingUtilities.invokeLater(runner);   }   protected void getFile() {     if (localFileName.length() == 0) {       localFileName = remoteFileName;       SwingUtilities.invokeLater(new Runnable() {         public void run() {           fileTextField.setText(localFileName);         }       });     }     byte[] buffer = new byte[BUFFER_SIZE];     try {       int size = getFileSize(ftpClient, remoteFileName);       if (size > 0) {         setMessage("File " + remoteFileName + ": " + size + " bytes");         setProgressMaximum(size);       } else         setMessage("File " + remoteFileName + ": size unknown");       FileOutputStream out = new FileOutputStream(localFileName);       InputStream in = ftpClient.get(remoteFileName);       int counter = 0;       while (true) {         int bytes = in.read(buffer);         if (bytes < 0)           break;         out.write(buffer, 0, bytes);         counter += bytes;         if (size > 0) {           setProgressValue(counter);           int proc = (int) Math               .round(m_progress.getPercentComplete() * 100);           setProgressString(proc + " %");         } else {           int kb = counter / 1024;           setProgressString(kb + " KB");         }       }       out.close();       in.close();     } catch (Exception ex) {       setMessage("Error: " + ex.toString());     }   }   protected void putFile() {     if (localFileName.length() == 0) {       setMessage("Please enter file name");     }     byte[] buffer = new byte[BUFFER_SIZE];     try {       File f = new File(localFileName);       int size = (int) f.length();       setMessage("File " + localFileName + ": " + size + " bytes");       setProgressMaximum(size);       FileInputStream in = new FileInputStream(localFileName);       OutputStream out = ftpClient.put(remoteFileName);       int counter = 0;       while (true) {         int bytes = in.read(buffer);         if (bytes < 0)           break;         out.write(buffer, 0, bytes);         counter += bytes;         setProgressValue(counter);         int proc = (int) Math             .round(m_progress.getPercentComplete() * 100);         setProgressString(proc + " %");       }       out.close();       in.close();     } catch (Exception ex) {       setMessage("Error: " + ex.toString());     }   }   protected void setMessage(final String str) {     if (str != null) {       Runnable runner = new Runnable() {         public void run() {           monitorTextArea.append(str + '\n');           monitorTextArea.repaint();         }       };       SwingUtilities.invokeLater(runner);     }   }   protected void setProgressValue(final int value) {     Runnable runner = new Runnable() {       public void run() {         m_progress.setValue(value);       }     };     SwingUtilities.invokeLater(runner);   }   protected void setProgressMaximum(final int value) {     Runnable runner = new Runnable() {       public void run() {         m_progress.setMaximum(value);       }     };     SwingUtilities.invokeLater(runner);   }   protected void setProgressString(final String string) {     Runnable runner = new Runnable() {       public void run() {         m_progress.setString(string);       }     };     SwingUtilities.invokeLater(runner);   }   public static int getFileSize(FtpClient client, String fileName)       throws IOException {     TelnetInputStream lst = client.list();     String str = "";     fileName = fileName.toLowerCase();     while (true) {       int c = lst.read();       char ch = (char) c;       if (c < 0 || ch == '\n') {         str = str.toLowerCase();         if (str.indexOf(fileName) >= 0) {           StringTokenizer tk = new StringTokenizer(str);           int index = 0;           while (tk.hasMoreTokens()) {             String token = tk.nextToken();             if (index == 4)               try {                 return Integer.parseInt(token);               } catch (NumberFormatException ex) {                 return -1;               }             index++;           }         }         str = "";       }       if (c <= 0)         break;       str += ch;     }     return -1;   }   public static void main(String argv[]) {     new FTPApp();   } }