在这里提醒一点,在网络编程中应该多使用线程,否则会出现死锁现象。
就程序界面不刷新了。
下面的程序是在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 );
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 ... ");
}
}
}
本人水平有限,望多指教。