[Advanced-java] sun.net.ftp.FTPProtocolException??
Bikash Paul
bikashpaul_2001 at yahoo.com
Fri Jul 25 10:20:13 2003
Hi all friends,
I am developing one FTP client for uploading and
downloading file to and from my webserver but when Iam
trying to upload and download file then my FTP client
connected to host and showing me user login OK but
after that it is giving me
"Error:sun.net.ftp.FTPProtocolException".I have tried
to find it out why it is giving me error but
couldn't.Can any one plz try with my code and help me
to slove my problem.Below r my codes.
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.net.*;
import java.lang.reflect.*;
import sun.net.ftp.*;
import sun.net.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
public class FTPApp extends JFrame
{
public static int BUFFER_SIZE = 1024;
protected JTextField m_txtUser;
protected JPasswordField m_txtPassword;
protected JTextField m_txtURL;
protected JTextField m_txtFile;
protected JTextArea m_monitor;
protected JProgressBar m_progress;
protected JButton m_btPut;
protected JButton m_btGet;
protected JButton m_btFile;
protected JButton m_btClose;
protected JFileChooser m_chooser;
protected FtpClient m_client;
protected String m_sLocalFile;
protected String m_sHostFile;
public FTPApp() {
super("Web Spinner FTP Client");
Toolkit test = Toolkit.getDefaultToolkit();
Image myImage = test.getImage("images/right.gif");
setIconImage(myImage);
JPanel p = new JPanel();
p.setBackground(new Color(212,218,179));
p.setLayout(new GridLayout(8,0));
p.setBorder(new EmptyBorder(5, 5, 5, 5));
m_txtUser = new JTextField("anonymous");
m_txtPassword = new JPasswordField();
m_txtURL = new JTextField();
m_txtFile = new JTextField();
m_monitor = new JTextArea(5, 20);
m_monitor.setEditable(false);
JScrollPane ps = new JScrollPane(m_monitor);
m_progress = new JProgressBar();
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());
m_btPut = new JButton("Put");
ActionListener lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (connect()) {
Thread uploader = new Thread() {
public void run() {
putFile();
disconnect();
}
};
uploader.start();
}
}
};
m_btPut.addActionListener(lst);
m_btPut.setMnemonic('p');
m_btGet = new JButton("Get");
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (connect()) {
Thread downloader = new Thread() {
public void run() {
getFile();
disconnect();
}
};
downloader.start();
}
}
};
m_btGet.addActionListener(lst);
m_btGet.setMnemonic('g');
m_btFile = new JButton("File");
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (m_chooser.showSaveDialog(FTPApp.this) !=
JFileChooser.APPROVE_OPTION)
return;
File f = m_chooser.getSelectedFile();
m_txtFile.setText(f.getPath());
}
};
m_btFile.addActionListener(lst);
m_btFile.setMnemonic('f');
m_btClose = new JButton("Close");
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (m_client != null)
disconnect();
else
System.exit(0);
}
};
m_btClose.addActionListener(lst);
m_btClose.setDefaultCapable(true);
m_btClose.setMnemonic('g');
getContentPane().add(p, BorderLayout.CENTER);
m_chooser = new JFileChooser();
m_chooser.setCurrentDirectory(new File("."));
m_chooser.setApproveButtonToolTipText(
"Select file for upload/download");
//creating layout
JPanel pan1 = new JPanel(new GridLayout(0,2));
pan1.add(new JLabel("User Name:"));
pan1.add(m_txtUser);
m_txtUser.setBackground(Color.white);
JPanel pan2 = new JPanel(new GridLayout(0,2));
pan2.add(new JLabel("Password"));
pan2.add(m_txtPassword);
m_txtPassword.setBackground(Color.white);
JPanel pan3 = new JPanel(new GridLayout(0,2));
pan3.add(new JLabel("Url"));
pan3.add(m_txtURL);
m_txtURL.setBackground(Color.white);
JPanel pan4 = new JPanel(new GridLayout(0,2));
pan4.add(new JLabel("File:"));
pan4.add(m_txtFile);
m_txtFile.setBackground(Color.white);
m_txtFile.setText("");
JPanel pan5 = new JPanel();
m_monitor.setSize(500,50);
ps.setSize(500,50);
pan5.add(ps);
JPanel pan6 = new JPanel();
pan6.add(m_progress);
JPanel pan7 = new JPanel(new GridLayout(0,4));
pan7.add(m_btPut);
pan7.add(m_btGet);
pan7.add(m_btFile);
pan7.add(m_btClose);
pan1.setBackground(new Color(212,218,179));
pan2.setBackground(new Color(212,218,179));
pan3.setBackground(new Color(212,218,179));
pan4.setBackground(new Color(212,218,179));
pan5.setBackground(new Color(212,218,179));
pan6.setBackground(new Color(212,218,179));
pan7.setBackground(new Color(212,218,179));
p.add(pan1);
p.add(pan2);
p.add(pan3);
p.add(pan4);
p.add(pan5);
p.add(pan6);
p.add(pan7);
m_monitor.setBackground(Color.white);
WindowListener wndCloser = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
disconnect();
System.exit(0);
}
};
addWindowListener(wndCloser);
setSize(340,340);
setResizable(false);
setVisible(true);
setLocation(220,130);
setBackground(new Color(212,218,179));
}
public void setButtonStates(boolean state) {
m_btPut.setEnabled(state);
m_btGet.setEnabled(state);
m_btFile.setEnabled(state);
}
protected boolean connect() {
m_monitor.setText("");
setButtonStates(false);
m_btClose.setText("Cancel");
setCursor(Cursor.getPredefinedCursor(
Cursor.WAIT_CURSOR));
String user = m_txtUser.getText();
if (user.length()==0) {
message("Please enter user name");
setButtonStates(true);
return false;
}
String password = new
String(m_txtPassword.getPassword());
String sUrl = m_txtURL.getText();
if (sUrl.length()==0) {
message("Please enter URL");
setButtonStates(true);
return false;
}
m_sLocalFile = m_txtFile.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);
}
m_sHostFile = sUrl;
try {
message("Connecting to host "+host);
m_client = new FtpClient(host);
m_client.login(user, password);
message("User "+user+" login OK");
message(m_client.welcomeMsg);
m_client.cd(sDir);
message("Directory: "+sDir);
m_client.binary();
return true;
}
catch (Exception ex) {
message("Error: "+ex.toString());
setButtonStates(true);
return false;
}
}
protected void disconnect() {
if (m_client != null) {
try { m_client.closeServer(); }
catch (IOException ex) {}
m_client = null;
}
Runnable runner = new Runnable() {
public void run() {
m_progress.setValue(0);
setButtonStates(true);
m_btClose.setText("Close");
FTPApp.this.setCursor(Cursor.getPredefinedCursor(
Cursor.DEFAULT_CURSOR));
}
};
SwingUtilities.invokeLater(runner);
}
protected void getFile() {
if (m_sLocalFile.length()==0) {
m_sLocalFile = m_sHostFile;
SwingUtilities.invokeLater( new Runnable() {
public void run() {
m_txtFile.setText(m_sLocalFile);
}
});
}
byte[] buffer = new byte[BUFFER_SIZE];
try {
int size = getFileSize(m_client, m_sHostFile);
if (size > 0) {
message("File " + m_sHostFile + ": " + size + "
bytes");
setProgressMaximum(size);
}
else
message("File " + m_sHostFile + ": size unknown");
FileOutputStream out = new
FileOutputStream(m_sLocalFile);
InputStream in = m_client.get(m_sHostFile);
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) {
message("Error: "+ex.toString());
}
}
protected void putFile() {
if (m_sLocalFile.length()==0) {
message("Please enter file name");
}
byte[] buffer = new byte[BUFFER_SIZE];
try {
File f = new File(m_sLocalFile);
int size = (int)f.length();
message("File " + m_sLocalFile + ": " + size + "
bytes");
setProgressMaximum (size);
FileInputStream in = new
FileInputStream(m_sLocalFile);
OutputStream out = m_client.put(m_sHostFile);
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) {
message("Error: " + ex.toString());
}
}
protected void message(final String str) {
if (str != null) {
Runnable runner = new Runnable() {
public void run() {
m_monitor.append(str + '\n');
m_monitor.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 void main(String argv[]) {
new FTPApp();
}
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;
}
}
Regards
Bikash
__________________________________
Do you Yahoo!?
Yahoo! SiteBuilder - Free, easy-to-use web site design software
http://sitebuilder.yahoo.com