在这里提醒一点,在网络编程中应该多使用线程,否则会出现死锁现象。 就程序界面不刷新了。
  
下面的程序是在VJ++中写的,并且已经通过,能运行。大家可以自己改为纯java的。 
import com.ms.wfc.app.*; import com.ms.wfc.core.*; import com.ms.wfc.ui.*; import com.ms.wfc.html.*; 
import sun.net.ftp.*; import sun.net.*; import java.io.* ; import java.net.*; 
/**  * 读写在另一个socket中进行,否则会阻塞!  */ public class Ftp_Study extends Form{    FtpClient aftp;  DataOutputStream outputs;  DataInputStream inputs;  TelnetInputStream ins;  TelnetOutputStream outs;    int ch;  String a="没有连接主机";  String b="正在连接,请等待.....";  String currentPath="/";//当前的目录  String selectFilePath="";//被中的文件      String hostname="";  String user="";  String pwd="";  int port =21;   
   public Ftp_Study()  {   super();   initForm();   init();        } 
 /**   * Ftp_Study overrides dispose so it can clean up the   * component list.   */  public void dispose(){   super.dispose();   components.dispose();  } 
 private void edit2_textChanged(Object source, Event e){     } 
 private void label3_click(Object source, Event e){     } 
 private void button1_click(Object source, Event e){//connect    file://this.setftpProxyHost ("61.152.210.94",3128);      this.label1.setText("正在连接,请等待.....");   this.hostname =this.edit1.getText();   this.user=this.edit2.getText();   this.pwd=this.edit3.getText();         if (this.connect(this.hostname,this.user,this.pwd)){                 this.button1.setEnabled(false);                 this.button2.setEnabled(true);         }    } 
 private void button2_click(Object source, Event e){//stop    System.out.println ("button stop start");   this.stop();         this.button1.setEnabled(true);         this.button2.setEnabled(false);         this.label1.setText("与主机"+hostname+"连接已断开!");   this.edit4.setText ("");   System.out.println ("button stop end");  } 
 private void button3_click(Object source, Event e){//go   System.out.println ("button enterDirectoryThread start");   String path=this.edit5 .getText ();     Thread t=new enterDirectoryThread(path);   t.setPriority (Thread.MIN_PRIORITY );   t.start();   System.out.println ("button enterDirectoryThread end");  } 
 private void button4_click(Object source, Event e){//getfile     System.out.println ("button getFileThread start");   Thread t=new getFileThread();   t.setPriority (Thread.MIN_PRIORITY );   t.start();     System.out.println ("button getFileThread end");  } 
 private void button5_click(Object source, Event e){//sendfile   System.out.println ("button sendFileThread start");   openFileDialog1.showDialog();   this.selectFilePath=openFileDialog1.getFileName ();   System.out.println (this.selectFilePath+" has been selected!");   Thread t=new sendFileThread();   t.setPriority (Thread.MIN_PRIORITY );   file://t.start();   System.out.println ("button sendFileThread end");     } 
 /**   * NOTE: The following code is required by the Visual J++ form   * designer.  It can be modified using the form editor.  Do not   * modify it using the code editor.   */  Container components = new Container();  Label label1 = new Label();  Label label2 = new Label();  Label label3 = new Label();  Label label4 = new Label();  Edit edit1 = new Edit();  Edit edit2 = new Edit();  Edit edit3 = new Edit();  Edit edit4 = new Edit();  Button button1 = new Button();  Button button2 = new Button();  Edit edit5 = new Edit();  Label label5 = new Label();  Button button3 = new Button();  Button button4 = new Button();  Button button5 = new Button();  OpenFileDialog openFileDialog1 = new OpenFileDialog(); 
 private void initForm()  {   this.setText("Ftp_Study");   this.setAutoScaleBaseSize(new Point(6, 12));   this.setClientSize(new Point(455, 348)); 
  label1.setLocation(new Point(16, 8));   label1.setSize(new Point(224, 24));   label1.setTabIndex(0);   label1.setTabStop(false);   label1.setText("没有连接主机"); 
  label2.setLocation(new Point(8, 40));   label2.setSize(new Point(48, 23));   label2.setTabIndex(1);   label2.setTabStop(false);   label2.setText("Host:"); 
  label3.setLocation(new Point(8, 72));   label3.setSize(new Point(48, 23));   label3.setTabIndex(2);   label3.setTabStop(false);   label3.setText("UseID:");   label3.addOnClick(new EventHandler(this.label3_click)); 
  label4.setLocation(new Point(184, 72));   label4.setSize(new Point(56, 23));   label4.setTabIndex(3);   label4.setTabStop(false);   label4.setText("PWD:"); 
  edit1.setLocation(new Point(64, 40));   edit1.setSize(new Point(296, 19));   edit1.setTabIndex(4);   edit1.setText(""); 
  edit2.setLocation(new Point(56, 72));   edit2.setSize(new Point(104, 19));   edit2.setTabIndex(5);   edit2.setText("");   edit2.addOnTextChanged(new EventHandler(this.edit2_textChanged)); 
  edit3.setLocation(new Point(240, 72));   edit3.setSize(new Point(104, 19));   edit3.setTabIndex(6);   edit3.setText("");   edit3.setPasswordChar('*'); 
  edit4.setLocation(new Point(8, 160));   edit4.setSize(new Point(440, 184));   edit4.setTabIndex(7);   edit4.setText("");   edit4.setMultiline(true);   edit4.setReadOnly(true);   edit4.setScrollBars(ScrollBars.BOTH);   edit4.setWordWrap(false); 
  button1.setLocation(new Point(384, 16));   button1.setSize(new Point(64, 24));   button1.setTabIndex(8);   button1.setText("连接");   button1.addOnClick(new EventHandler(this.button1_click)); 
  button2.setEnabled(false);   button2.setLocation(new Point(384, 48));   button2.setSize(new Point(64, 24));   button2.setTabIndex(9);   button2.setText("断开");   button2.addOnClick(new EventHandler(this.button2_click)); 
  edit5.setLocation(new Point(56, 104));   edit5.setSize(new Point(312, 19));   edit5.setTabIndex(10);   edit5.setText(""); 
  label5.setLocation(new Point(16, 104));   label5.setSize(new Point(40, 24));   label5.setTabIndex(11);   label5.setTabStop(false);   label5.setText("Path:"); 
  button3.setLocation(new Point(384, 80));   button3.setSize(new Point(64, 23));   button3.setTabIndex(12);   button3.setText("Go!");   button3.addOnClick(new EventHandler(this.button3_click)); 
  button4.setLocation(new Point(224, 128));   button4.setSize(new Point(64, 24));   button4.setTabIndex(13);   button4.setText("getFile");   button4.addOnClick(new EventHandler(this.button4_click)); 
  button5.setLocation(new Point(304, 128));   button5.setSize(new Point(64, 24));   button5.setTabIndex(14);   button5.setText("sendFile");   button5.addOnClick(new EventHandler(this.button5_click)); 
  /* @designTimeOnly openFileDialog1.setLocation(new Point(288, 8)); */ 
  this.setNewControls(new Control[] {        button5,         button4,         button3,         label5,         edit5,         button2,         button1,         edit4,         edit3,         edit2,         edit1,         label4,         label3,         label2,         label1});  } 
 public void init(){   this.edit1.setText("202.115.16.2");   this.edit2.setText ("anonymous");   this.edit3.setText ("0000");    }    public boolean connect(String hostname,String uid,String pwd){   this.hostname =hostname;   this.label1 .setText (this.b );   this.a ="连接主机: "+hostname+" 成功";   boolean bsuccess=true;//success      try{    this.aftp =new FtpClient(this.hostname);    this.aftp.login (uid,pwd);    this.aftp .binary ();    this.showFileContents ();    }   catch(FtpLoginException e){    this.a="无权限与主机: "+hostname+" 连接";    bsuccess=false;   }   catch(IOException e){    this.a="连接主机: "+hostname+" 失败";       bsuccess=false;   }   catch(SecurityException e){    this.a="无权限与主机: "+hostname+" 失败";       bsuccess=false;   }   finally{    this.label1 .setText (a);    return bsuccess;   }      }    public void stop(){   try{    this.aftp.closeServer ();     }   catch(IOException e){   }   } 
 /**   * filepath --local file path   */  public boolean sendFile(String filepath){   boolean result =true;//success?   if(this.aftp !=null){    this.label1 .setText("正在粘贴文件,请耐心等待....");    String contentperline;    a="粘贴成功!";    /*    try {     FtpClient ftpClient=new FtpClient();     ftpClient.openServer(this.hostname);     ftpClient.login(this.user ,this.pwd);     if (this.selectFilePath.length()!=0)         ftpClient.cd(this.currentPath);     ftpClient.binary();     String fn=new File(this.selectFilePath).getName();//filename     TelnetOutputStream is=ftpClient.put(fn);     File file_out=new File(fn);     FileOutputStream os=new      FileOutputStream(file_out);     byte[] bytes=new byte[1024];     int c;     while ((c=is.write(bytes))!=-1) {        os.write(bytes,0,c);     }     is.close();     os.close();     ftpClient.closeServer();    }catch(IOException e){     a="粘贴失败!";     result=false;       } */    this.label1 .setText (a);    this.showFileContents ();   }   else{    result=false;     }    return result;   } 
 /**   *  show all the conten of the file list   */  public void showFileContents(){//其中的空当都是空格!   StringBuffer buf=new StringBuffer();   this.edit4.setText ("");   try{    this.ins=this.aftp.list ();//return the telnetinputstream    while((this.ch=this.ins.read())>0){     buf.append ((char)ch);//空当都 是空格        }    this.edit4.setText(buf.toString());    this.ins.close ();    System.out.println ("showFileContents ins closed");   }   catch(IOException e){     }    } 
 /**   * 进入目录中   */  public void enterDiectory(String path){   try{    if (path.length()>0){     this.aftp.cd(path); file://enter in the directory         this.showFileContents();     if(path.equals("..") ){      int pos=0;      pos=this.currentPath.lastIndexOf("/");      this.currentPath=this.currentPath.substring(0,pos);           pos=this.currentPath.lastIndexOf("/");      this.currentPath=this.currentPath.substring (0,pos+1);     }     else      this.currentPath=this.currentPath+path+"/";     this.a="当前目录: "+this.currentPath;     System.out.println ("this.currentPath: "+this.currentPath);    }   }   catch(IOException e){    this.a="无法进入目录: /"+path;      }   finally{    this.label1 .setText (this.a );       }  }    public void getFile(String filename){   try {    FtpClient ftpClient=new FtpClient();    ftpClient.openServer(this.hostname);    ftpClient.login(this.user, this.pwd);    if (this.currentPath.length()!=0)      ftpClient.cd(this.currentPath);    ftpClient.binary();    TelnetInputStream is=ftpClient.get(filename);    File file_out=new File(filename);    FileOutputStream os=new FileOutputStream(file_out);    byte[] bytes=new byte[1024];    int c;    while ((c=is.read(bytes))!=-1) {       os.write(bytes,0,c);    }    is.close();    os.close();    ftpClient.closeServer();      } catch (IOException ex) {;} 
 }    public void getFile(){   String filename=this.edit5.getText();   this.getFile(filename);     }    /*  public void setftpProxyHost(String ProxyHost,int ProxyPort){   this.aftp.ftpProxyHost=ProxyHost;   this.aftp.ftpProxyPort=ProxyPort;   this.aftp.useFtpProxy=true;  }*/    /**   * The main entry point for the application.    *   * @param args Array of parameters passed to the application   * via the command line.   */  public static void main(String args[])  {   Application.run(new Ftp_Study());  }    class getFileThread extends Thread {   public void run(){    getFile();    System.out.println ("getFile is completed");   }          }    class sendFileThread extends Thread {   public void run(){       sendFile(selectFilePath);    System.out.println ("sendFile is completed. ");   }          }    class enterDirectoryThread extends Thread {   String szPath;      public enterDirectoryThread(String path){    this.szPath =path;   }      public void run(){    enterDiectory(this.szPath);    System.out.println ("enterDiectory is completed");   }  }    class connectThread extends Thread {   String hostname="";   String uid="";   String pwd="";      public connectThread(String hostname1,String uid1,String pwd1){    this.hostname=hostname1;    this.uid=uid1;    this.pwd =pwd1;   }      public void run(){    connect(this.hostname,this.uid,this.pwd);    System.out.println ("connect ... ");   }          }   } 
  
本人水平有限,望多指教。
   
 
  |