검토 된 자바 FTP 클라이언트 라이브러리

FTP 서버를 실행하는 원격 컴퓨터에서 파일을 다운로드해야하는 순수한 Java 애플리케이션을 작성하려는 상황을 상상해 봅시다. 또한 이름, 날짜 또는 크기와 같은 원격 파일 정보를 기준으로 다운로드를 필터링하려고합니다.

FTP 용 프로토콜 핸들러를 처음부터 작성하는 것이 가능하고 재미있을 수도 있지만 그렇게하는 것도 어렵고 길며 잠재적으로 위험 할 수 있습니다. 처리기를 직접 작성하는 데 시간, 노력 또는 돈을 소비하지 않기 때문에 기존 소프트웨어 구성 요소를 재사용하는 것을 선호합니다. 그리고 World Wide Web에서 많은 라이브러리를 사용할 수 있습니다. FTP 클라이언트 라이브러리를 사용하면 파일 다운로드를 다음과 같이 간단하게 Java로 작성할 수 있습니다.

FTPClient ftpClient = new FTPClient (); ftpClient.connect ( "ftp.foo.com", "user01", "pass1234"); ftpClient.download ( "C : \\ Temp \\", "README.txt"); // 결국 여기에 다른 작업이 있습니다. ftpClient.disconnect ();

우리의 요구에 맞는 양질의 Java FTP 클라이언트 라이브러리를 찾는 것은 생각만큼 간단하지 않습니다. 매우 고통 스러울 수 있습니다. Java FTP 클라이언트 라이브러리를 찾는 데 시간이 걸립니다. 그런 다음 기존 라이브러리를 모두 찾은 후 어떤 라이브러리를 선택합니까? 각 라이브러리는 서로 다른 요구를 해결합니다. 라이브러리의 품질이 다르며 디자인이 근본적으로 다릅니다. 각각은 서로 다른 기능 세트를 제공하며이를 설명하기 위해 서로 다른 유형의 전문 용어를 사용합니다.

따라서 FTP 클라이언트 라이브러리를 평가하고 비교하는 것은 어렵고 혼란 스러울 수 있습니다. 기존 구성 요소를 재사용하는 것은 칭찬할만한 프로세스이지만이 경우 처음 시작하는 것이 좋지 않을 수 있습니다. 그리고 이것은 부끄러운 일입니다. 좋은 FTP 라이브러리를 선택한 후에 나머지는 일상적인 것입니다.

이 기사는 선택 과정을 짧고 쉽고 가치있게 만드는 것을 목표로합니다. 먼저 사용 가능한 모든 FTP 클라이언트 라이브러리를 나열합니다. 그런 다음 도서관이 어떤 식 으로든 다루어야 할 관련 기준 목록을 정의하고 설명합니다. 마지막으로 라이브러리가 서로 겹쳐지는 방식을 빠르게 볼 수있는 개요 매트릭스를 제공합니다. 이 모든 정보는 빠르고 안정적이며 오래 지속되는 결정을 내리는 데 필요한 모든 것을 제공합니다.

JDK에서 FTP 지원

FTP에 대한 참조 사양은 Request for Comments : 959 (RFC959)입니다. Sun Microsystems는 JDK에서 RFC959 구현을 제공하지만 내부적이며 문서화되지 않았으며 소스가 제공되지 않습니다. RFC959는 그림자 속에 있지만 실제로는 그림 1과 같이 URL 사양 인 RFC1738을 구현하는 공용 인터페이스의 백엔드입니다.

RFC1738 구현은 JDK에서 표준으로 제공됩니다. 기본적인 FTP 전송 작업을 위해 합리적인 작업을 수행합니다. 공개되고 문서화되어 있으며 소스 코드가 제공됩니다. 이를 사용하기 위해 다음과 같이 작성합니다.

URL url = new URL ( "ftp : // user01 : [email protected]/README.txt; type = i"); URLConnection urlc = url.openConnection (); InputStream은 = urlc.getInputStream (); // OutputStream을 다운로드하려면 os = urlc.getOutputStream (); // 업로드하려면

JDK의 FTP 클라이언트 지원은 표준 권장 사항을 엄격히 따르지만 몇 가지 단점이 있습니다.

  • 타사 FTP 클라이언트 라이브러리와 근본적으로 다릅니다. 이들은 RFC1738이 아닌 RFC959를 구현합니다.
  • RFC959는 대부분의 데스크톱 FTP 클라이언트 도구에서 구현됩니다. 많은 Java 프로그래머가 이러한 도구를 사용하여 FTP 서버에 연결합니다. 취향에 따라 이러한 도구는 RFC959와 유사한 라이브러리를 선호합니다.
  • URLURLConnection통신을위한 클래스에만 개방 스트림. 구조에 대한 일 라이브러리 제공없이 바로 지원은 더 사용할 수있는 자바에 원시 FTP 서버 응답과 같은 개체를 String, File, RemoteFile, 또는 Calendar. 따라서 파일에 데이터를 쓰거나 디렉토리 목록을 활용하려면 더 많은 코드를 작성해야합니다.
  • RFC1738의 섹션 3.2.5, "최적화"에 설명 된대로 FTP URL은 모든 작업 후에 (제어) 연결을 닫아야합니다. 이것은 많은 작은 파일을 전송하는 데 낭비이며 효율적이지 않습니다. 또한 극도로 제한적인 FTP 서버는 이러한 통신 오버 헤드를 사악한 네트워크 공격 또는 남용으로 간주하고 추가 서비스를 거부 할 수 있습니다.
  • 마지막으로 몇 가지 유용한 기능이 없습니다.

이러한 이유로 인해 타사 라이브러리를 사용하는 것이 좋습니다. 다음 섹션에는 사용 가능한 타사 대안이 나열되어 있습니다.

도서관 비교

아래 목록은이 기사 전체에서 비교 한 라이브러리를 요약 한 것입니다. 모두 참조 FTP 사양을 따릅니다. 아래에서 공급자 이름과 라이브러리 이름 (이탤릭체)을 언급합니다. 리소스에는 각 제품 웹 사이트에 대한 링크가 포함되어 있습니다. 라이브러리 사용을 시작하기 위해 기본 FTP 클라이언트 클래스도 언급했습니다.

  1. JScape, iNet 공장 :com.jscape.inet.ftp.Ftp
  2. / n 소프트웨어, IP * Works :ipworks.Ftp
  3. 엔터프라이즈 분산 기술, Java FTP 클라이언트 라이브러리 :com.enterprisedt.net.ftp.FTPClient
  4. IBM alphaWorks, FTP Bean Suite :com.ibm.network.ftp.protocol.FTPProtocol
  5. SourceForge, JFtp :net.sf.jftp.net.FtpConnection
  6. 자카르타 프로젝트, Jakarta Commons / Net :org.apache.commons.net.ftp.FTPClient
  7. JavaShop JNetBeans :jshop.jnet.FTPClient
  8. Sun, JDK :sun.net.ftp.FtpClient
  9. Florent Cueto, JavaFTP API :com.cqs.ftp.FTP
  10. Bea Petrovicova, jFTP :cz.dhl.ftp.Ftp
  11. Globus 프로젝트, Java CoG 키트 :org.globus.io.ftp.FTPClient

메모:

  • 이 글을 쓰는 시점에서 IBM은 자사 웹 사이트에서 alphaWorks FTP Bean Suite를 제공하는 것의 적합성을 평가하고 있습니다. 지금은 모든 사용자에 대해 다운로드가 닫혀 있습니다.
  • Jakarta Commons / Net은 더 이상 개발되지 않은 Savarese NetComponents의 드롭 인 대체품입니다.
  • JavaShop JNetBeans가 버려진 것 같습니다. 이 글을 쓰는 시점에서 사이트는 한 달 이상 오프라인 상태였으며 지원 요청에 대한 답변을받지 못했습니다.

기준

지금까지 컨텍스트를 소개하고 사용 가능한 라이브러리를 나열했습니다. 이제 각 라이브러리를 평가할 관련 기준을 나열합니다. 최종 비교 매트릭스에 사용 된 약어 ( 굵게 표시 ) 와 함께 각 기준에 대해 가능한 값을 열거합니다 .

제품 지원

라이브러리는 제품 문서, 컴파일 된 Javadocs, 샘플 코드 및 주석과 설명을 포함 할 수있는 예제 애플리케이션을 통해 사용자에게 지원을 제공합니다. 포럼, 메일 링리스트, 연락처 이메일 주소 또는 온라인 버그 추적 시스템을 통해 사용자에게 추가 지원을 제공 할 수 있습니다. / n 소프트웨어는 추가 비용으로 광범위한 지원을 제공합니다.

지원 관리자의 동기는 빠른 지원을위한 중요한 요소입니다. 지원 관리자는 다음과 같습니다.

  • 자발적인 개인 ( I )
  • 자발적인 그룹 ( G )
  • 지원을 제공하기 위해 지불 한 전문 법인 ( P )

특허

상업 프로젝트의 경우 제품 라이선스는 처음부터 고려해야 할 중요한 사항입니다. 일부 라이브러리는 상업용 제품으로 자유롭게 재배포 할 수 있지만 다른 라이브러리는 그렇지 않습니다. 예를 들어 GPL (GNU General Public License)은 강력하고 제한적인 라이선스 인 반면 Apache Software 라이선스는 재배포 된 제품에서만 언급하면됩니다.

상용 라이센스는 라이브러리로 프로그래밍하는 개발 워크 스테이션의 수를 제한하지만 라이브러리 자체의 배포는 제한되지 않습니다.

비상업적 프로젝트의 경우 라이센스는 철학의 문제입니다. 무료 제품이 좋습니다.

라이센스는 다음과 같습니다.

  • 상업용 ( C )
  • GPL ( G )
  • 무료 ( F ); 그러나 제한 사항에 대해서는 무료 라이센스를 확인하십시오.

일부 라이브러리 제공 업체는 필요에 따라 덜 제한적인 대체 라이센스를 제공합니다.

제공된 소스 코드

비공개 소스의 블랙 박스 소프트웨어 라이브러리는 짜증 스러울 수 있습니다. 다음과 같은 이유로 소스 코드를 갖는 것이 더 편할 수 있습니다.

  • 애플리케이션 코드 실행을 디버깅 할 때 라이브러리 코드 소스로 들어가면 라이브러리 동작을 이해하는 데 도움이 될 수 있습니다.
  • 소스 코드에는 유용한 주석이 있습니다.
  • 특별한 요구에 맞게 소스 코드를 빠르게 조정할 수 있습니다.
  • 예시 소스 코드는 영감을 줄 수 있습니다.

나이

라이브러리는 첫 번째 공개 릴리스 이후 테스트, 디버깅 및 지원되었습니다. 버전 번호는 라이브러리마다 다르기 때문에이 기준은 최초 공개 연도를 기준으로합니다.

디렉토리 목록 지원

Retrieving remote file information (name, size, date) from the server is important in most applications. The FTP protocol offers the NLST command to retrieve the file names only; the NLST command is explicitly designed to be exploited by programs. The LIST command offers more file information; as RFC959 notes, "Since the information on a file may vary widely from system to system, this information may be hard to use automatically in a program, but may be quite useful to a human user." No other standard method retrieves file information; therefore, client libraries try to exploit the LIST response. But this is not an easy task: since no authoritative recommendation is available for the LIST response format, FTP servers have adopted various formats:

  • Unix style: drwxr-xr-x 1 user01 ftp 512 Jan 29 23:32 prog
  • Alternate Unix style: drwxr-xr-x 1 user01 ftp 512 Jan 29 1997 prog
  • Alternate Unix style: drwxr-xr-x 1 1 1 512 Jan 29 23:32 prog
  • A symbolic link in Unix style: lrwxr-xr-x 1 user01 ftp 512 Jan 29 23:32 prog -> prog2000
  • Weird Unix style (no space between user and group): drwxr-xr-x 1 usernameftp 512 Jan 29 23:32 prog
  • MS-DOS style: 01-29-97 11:32PM prog
  • Macintosh style: drwxr-xr-x folder 0 Jan 29 23:32 prog
  • OS/2 style: 0 DIR 01-29-97 23:32 PROG

Unix style, then MS-DOS style, are the most widespread formats.

Java FTP client libraries try to understand and auto-detect as many formats as possible. In addition, they offer various alternatives for handling unexpected format answers:

  • An additional method returning a raw FTP response as one string (S)
  • An additional method returning a collection of raw strings, one string per line/file (C)
  • A framework supporting pluggable parsers (P)

Most libraries parse LIST responses and structure raw file information into Java objects. For example, with JScape iNet Factory, the following code retrieves and exploits file information received in a directory listing:

java.util.Enumeration files = ftpClient.getDirListing(); while (files.hasMoreElements()) { FtpFile ftpFile = (FtpFile) files.nextElement(); System.out.println(ftpFile.getFilename()); System.out.println(ftpFile.getFilesize()); // etc. other helpful methods are detailed in Javadoc } 

Section "Solutions for Remaining Problems" further considers directory listings.

Timestamp retrieval

In many cases, we are interested in a remote file's latest modification timestamp. Unfortunately, no RFC introduces a standard FTP command to retrieve this information. Two de facto methods exist:

  1. Retrieve this information from the LIST response by parsing the server answer. Unfortunately, as you learned in the previous section, the LIST response varies among FTP servers, and the timestamp information is sometimes incomplete. In the Unix format, imprecision occurs when the remote file is more than one year old: only the date and year, but not hours or minutes are given.
  2. Use the nonstandard MDTM command, which specifically retrieves a remote file's last modification timestamp. Unfortunately, not all FTP servers implement this command.

An intricate alternative to MDTM command support is to send a raw MDTM command and parse the response. Most libraries provide a method for sending a raw FTP command, something like:

String timeStampString = ftpClient.command("MDTM README.txt"); 

Another possible concern is that FTP servers return time information in GMT (Greenwich Mean Time). If the server time zone is known apart from FTP communication, the java.util.TimeZone.getOffset() method can help adjust a date between time zones. See JDK documentation for further information about this method.

Section "Solutions for Remaining Problems" further considers file timestamp retrieval.

Firewalls

Typically, a firewall is placed between a private enterprise network and a public network such as the Internet. Access is managed from the private network to the public network, but access is denied from the public network to the private network.

Socks is a publicly available protocol developed for use as a firewall gateway for the Internet. The JDK supports Socks 4 and Socks 5 proxies, which can be controlled by some of the libraries. As an alternative, the JVM command line can set the Socks proxy parameters: java -DsocksProxyPort=1080 -DsocksProxyHost=socks.foo.com -Djava.net.socks.username=user01 -Djava.net.socks.password=pass1234 ...

Another common alternative to Socks proxy support is to "socksify" the underlying TCP/IP layer on the client machine. A product like Hummingbird can do that job.

The JDK also supports HTTP tunnels. These widespread proxies do not allow FTP uploads. /n software's IP*Works allows you to set HTTP tunnel parameters.

대부분의 라이브러리는 활성 및 수동 연결을 모두 지원합니다. 수동 연결은 클라이언트가 더 높은 포트로 들어오는 연결을 금지하는 방화벽 뒤에있을 때 유용합니다. RFC1579는이 방화벽 친화적 기능에 대해 자세히 설명합니다. 일부 제품의 설명서 에서는 각각 활성 및 수동 연결을 PORTPASV명령 으로 참조합니다 .

병렬 전송

데스크톱 애플리케이션에서 전송이 기본 단일 스레드에서 시작되면 모든 것이 정지됩니다. 일부 라이브러리는 별도의 스레드에서 병렬 전송을 위해 이벤트 루프를 자동으로 서비스하므로 자체 스레드를 만들고 관리 할 필요가 없습니다.

JavaBean 사양 지원

일부 라이브러리는 JavaBean 사양을 구현합니다. JavaBean 준수를 통해 주요 Java IDE에 포함 된 시각적 프로그래밍이 가능합니다.