JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java SE 討論區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 FTP 类库介紹 [精華]
dorian

Dorian



發文: 164
積分: 5
於 2004-11-28 11:51 user profilesend a private message to usersend email to dorianreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
今天在网上闲逛,发现了一个FTP客户端的类库.
名叫edtFtpJ,他是一个实现了RFC959的纯Java类库.
在www.enterprisedt.com上可以获得.

看了看源码,没算测试类,总共才17个类和接口.
所以就简单的看了看.

FTPException ----此类为FTP的异常处理类,继承了Exception,没有什么内容,都交给超类来处理了
还加了个响应码(replyCode)
FTPTransferType ----此类封装了传输文件的类型.现在这个类库只支持两种类型,一个是ASCII和
Image(常称为BINARY),在源码文件包中的doc目录中有一个RFC959的文件,它
是较早的FTP参考规范,其中指定了5种数据类型,ASCII,EBCDIC,IMAGE,LOCAL和
FORMAT.在此类中还实现了Type命令,需要为ASCII和Image类型指定不同的字符.
FTPReply ----此类封装了服务器返回的响应信息.响应信息在此类中分为两种,一种为响应码(replyCode)
另一种为响应文本(或者是响应内容)(replyText).可以看FTP规范种的响应码和
响应文本的详细定义.
FTPConnectMode ----此类封装了用FTP进行连接的模式.有两种模式,主动(Active)和被动(Passive)模式.
主动模式就是客户端提供一个端口,来让服务器进行连接.而被动模式就是服务器自动
生成一个随即的端口,来供客户端进行连接.

FTPDataSocket ----此为接口,主动连接和被动连接都实现此接口.另外此接口定义了一个超时的设置.
FTPActiveDataSocket ----此类为主动连接模式,实现了FTPDataSocket接口.封装了基本的Socket类.
FTPPassiveDataSocket----此类为被动连接模式,实现了FTPDataSocket接口.封装了基本的Socket类.
FTPControlSocket ----此类实现了服务器和客户端之间连接的控制.
createDataSocket方法用来创建主动或者是被动连接的通道.
1
2
3
4
5
if(connectMode == FTPConnectMode.ACTIVE)
     return createDataSocketActive();
 else
    return createDataSocketPASV();
 

sendCommand方法利用类中的输出成员来发送命令.
readReply方法利用类中的输入成员来处理响应.在RFC959中,如果信息只有一行的话,
其格式为:"响应码+空格+响应文本",而如果有多行的话,其格式为:"响应码+'-'+若干
行+最后一行(首行响应码+空格+最后信息)".该方法处理多行信息时用空格替换了回车
1
reply.append(" ").append(line);
,并且省略了最后一行的响应码.

FTPClient ----此类有两个主要成员,进行控制的FTPControlSocket类和进行数据传输的FTPDataSocket
包含了一些状态成员,有连接模式,传输模式,超时时间等.
包含了监视相关成员,监视器,监视区间(以字节表示).监视器为此类库中的FTPProgressMonitor接口
在此类库中没有对此接口的实现,需要自己实现.它定义的目的为监视传输过程,就是当你每传输
一定量的字节后,可以调用接口中的方法来做一些特定的操作.
FTPClient的主要功能就是进行上传和下载的操作.有多个重载的上传(put)和下载(get)的方法.
上传文件时,可以指定是否是接在原文件的后面还是覆盖此文件.然后根据连接类型来选择不同的连接
模式.

还有一些类为文件类型的类和一些消息控制和响应的类.

再来看看如何来简单使用这个类库
直接给出代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
String host = "ftp.xxx.com";
int    port = 21;
 
String user      = "dorian";
String password  = "dorian";
 
String remoteFile = "readme.txt";
String localPath  = "c:/temp/";
 
FtpClient client = new FtpClient(host,port);
client.login(user,psw);
client.get(localPath,remoteFile);
client.quit();


如你所看到的取一个文件就是那么简单^_^

这是它自带的一个Demo,可以看到另一些用法.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import com.enterprisedt.net.ftp.FTPClient;
import com.enterprisedt.net.ftp.FTPMessageCollector;
import com.enterprisedt.net.ftp.FTPTransferType;
import com.enterprisedt.net.ftp.FTPConnectMode;
import com.enterprisedt.util.debug.Level;
import com.enterprisedt.util.debug.Logger;
 
public class Demo {
    /**
     *  Log stream
     */
    private static Logger log = Logger.getLogger(Demo.class);
 
    public static void main(String[] args) {
 
        // we want remote host, user name and password
        if (args.length < 3) {
            usage();
            System.exit(1);
        }
 
        // assign args to make it clear
        String host = args[0];
        String user = args[1];
        String password = args[2];
 
        Logger.setLevel(Level.ALL);
 
        FTPClient ftp = null;
 
        try {
            // set up client
            log.info("Connecting");
 
            ftp = new FTPClient(host);
            FTPMessageCollector listener = new FTPMessageCollector();
            ftp.setMessageListener(listener);
 
            // login
            log.info("Logging in");
            ftp.login(user, password);
 
            // set up passive ASCII transfers
            log.debug("Setting up passive, ASCII transfers");
            ftp.setConnectMode(FTPConnectMode.PASV);
            ftp.setType(FTPTransferType.ASCII);
 
            // get directory and print it to console            
            log.debug("Directory before put:");
            String[] files = ftp.dir(".", true);
            for (int i = 0; i < files.length; i++)
                log.debug(files[i]);
 
            // copy file to server 
            log.info("Putting file");
            ftp.put("test.txt", "test.txt");
 
            // get directory and print it to console            
            log.debug("Directory after put");
            files = ftp.dir(".", true);
            for (int i = 0; i < files.length; i++)
                log.debug(files[i]);
 
            // copy file from server
            log.info("Getting file");
            ftp.get("test.txt" + ".copy", "test.txt");
 
            // delete file from server
            log.info("Deleting file");
            ftp.delete("test.txt");
 
            // get directory and print it to console            
            log.debug("Directory after delete");
            files = ftp.dir("", true);
            for (int i = 0; i < files.length; i++)
                log.debug(files[i]);
 
            // Shut down client                
            log.info("Quitting client");
            ftp.quit();
 
            String messages = listener.getLog();
            log.debug("Listener log:");
            log.debug(messages);
 
            log.info("Test complete");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void usage() {
 
        System.out.println("Usage: Demo remotehost user password");
    }
 
}


此网站还有一个edtFTPSSL的类库,我还没看,看这个名字估计是安全方面的.
当然你还可以在此网站看到一个.Net实现的类库.

希望这些对你有用.
--Dorian


browser edited on 2004-11-28 12:04
reply to postreply to post
話題樹型展開
人氣 標題 作者 字數 發文時間
9810 [精華] FTP 类库介紹 dorian 8052 2004-11-28 11:51
» JWorld@TW »  Java SE 討論區

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8