SSISO Community

시소당

자바로 FTP 클라이언트 프로그램 작성하기

전에  올린  소스를  다듬고  내용을  편집했습니다.

#####################################################################################

http://network.hanbitbook.co.kr/view_news.htm?serial=578

본  기사는  지난달  한빛북  사이트에서  실시한  「한빛  네트워크  기사  공모전」  가작에  입상한  기사이다.  알게  모르게  평소  많이  사용하고  있는  FTP  프로토콜에  대해  설명하고  있으며  자바로  FTP  클라이언트  프로그램을  개발하는  방법을  자세하게  설명하고  있다.

#####################################################################################

한빛  네트워크  기사  공모전」  가작:  김영익

FTP?  자바?

FTP는  요즘  같은  인터넷  세상에서  빠지지  않는  프로토콜이다.  FTP가  무엇인지  잘  모른다면  다음을  참고하자.
FTP  (File  Transfer  Protocol)  ;  파일  전송  프로토콜

FTP  [에프  티  피]는  인터넷상의  컴퓨터들간에  파일을  교환하기  위한  표준  프로토콜로서  가장  간단한  방법이기도  하다.  화면에  표시할  수  있는  웹  페이지와  관련  파일들을  전송하는  HTTP  (Hypertext  Transfer  Protocol),  전자우편을  전송하는  SMTP  (Simple  Mail  Transfer  Protocol)등과  같이,  FTP도  역시  인터넷의  TCP/IP  응용  프로토콜  중의  하나이다.  FTP는  웹  페이지  파일들을  인터넷상에서  모든  사람이  볼  수  있도록  하기  위해  저작자의  컴퓨터로부터  서버로  옮기는  과정에서  사용된다.  또한,  다른  서버들로부터  자신의  컴퓨터로  프로그램이나  파일들을  다운로드  하는  데에도  많이  사용된다.

사  용자  입장에서는  간단한  명령어를  통하여  FTP를  쓰거나,  또는  그래픽  사용자  인터페이스를  제공하는  상용  프로그램을  쓸  수도  있다.  보통은  웹  브라우저도  웹  페이지로부터  선택한  프로그램을  다운로드  하는데  FTP를  사용한다.  FTP를  사용하여  서버에  있는  파일을  지우거나  이름을  바꾸거나  옮기거나  복사하는  등  갱신작업을  할  수도  있다.  FTP  서버에는  로그온을  해야  하지만,  익명의  FTP를  사용하여  모든  사람들에게  공개된  파일들을  쉽게  접근할  수  있도록  하고  있다.

FTP는  보통  TCP/IP에  함께  딸려오는  일련의  프로그램  속에  포함되어  있다.
간  단히  말해서  FTP는  파일  전송  프로토콜이다.  우리는  FTP라는  프로토콜을  알게  모르게  많이  사용하고  있다.  회사  동료들  사이에  문서를  주고  받거나,  친구들과  음악  파일,  동영상  등을  주고  받는데  항상  사용하고  있는  것이다.  일반  컴퓨터  사용자들은  프로토콜이니  그런  것에는  관심  없을  것이다.  내가  원하는  파일을  주고  받기만  하면  될  뿐이니까…  그래도  FTP를  사용하기  위해서는  기본  명령을  알아야  한다.  하지만  이런  기본  명령  조차도  귀찮을  다름이다.

FTP  클라이언트  프로그램을  사용하면  FTP  명령을  알지  못하는  사람들도  GUI  환경에서  쉽게  FTP  서버에  접속해서  원하는  파일들을  주고  받을  수  있다.  일반적으로  많이  사용되는  FTP  클라이언트  프로그램으로는  WS_FTP,  CuteFTP,  알FTP  등이  있다.  그렇다면  과연  누가  이런  FTP  클라이언트  프로그램을  만드는가?  당연히  개발자의  몫이다.  그럼  또한  자바로는  가능한가.  당연히  자바로도  가능하다.  원래  자바라는  언어  자체가  네트워크  분야에서  강력한  힘을  발휘한다고  하지  않는가?  이제부터  우리는  자바로  FTP  클라이언트  프로그램을  개발해  볼  것이다.  물론  다른  상용  프로그램처럼  훌륭한  GUI를  지원하는  프로그램은  아니다.  콘솔에서  작동하는  “Hello  FTP”를  개발할  것이다.  “에이,  GUI가  없다면  썰렁할텐데…”  물론  이렇게  생각하는  분들도  있을  것이다.  하지만  모든  프로그램은  항상  “Hello”로부터  시작되므로  무시해서는  안될  것이다.  화려한  GUI  개발은  여러분들이  직접  해보시길  바란다.  아마  쉽지  않은  작업이  분명할  듯…

무엇이  필요한가?

당연히  자바로  개발하기  위해서는  JDK가  있어야  한다.  JDK를  구하고  설치하는  것은  다른  자바  기초  서적을  참고하기  바란다.

자  바만으로도  FTP  관련  프로그램을  만들  수  는  있다.  sun.net.ftp  패키지에  보면  FTP  클라이언트  구현을  위한  클래스들이  있다.  하지만  필자가  프로젝트를  하면서  이  패키지를  사용해  보았는데,  몇몇  기능이  원하는  기능을  지원하지  않는  것을  알게  되었다.  그리고  썬사의  문서를  참고하면  sun으로  시작되는  패키지는  사용하지  말라고  권하고  있다.

아…  그렇다면  어찌해야  한단  말인가?
FTP  프로토콜을  지원하는  모든  기능을  다  구현해야  한다는  말인가?  충분한  시간과  실력이  된다면  그것도  좋은  방법이다.  일단  실력은  둘째  치고라도  우리에게는  충분한  시간이  없다.  이럴  때  도움을  받을  수  있는  수  많은  오픈  소스들과  공짜  패키지  들이  있지  않은가?  비겁하고  치사하다고  생각할  필요는  없다고  생각하자.  어차피  우리는  생활에  필요한  대부분의  것을  남이  만든  것을  사다  쓰고  있는  현실이니…

http://www.savarese.org/java/index.html에  가면  NetComponents에  대한  설명이  있다.  자세한  것은  읽어보면  알겠지만  소스  코드까지  무료로  사용할  수  있다.  우리는  이것을  사용할  것이다.  http://www.savarese.org/downloads/NetComponents/에서  다운로드  받으면  된다.  필자는  NetComponents-1.3.8-bin.zip  파일을  다운로드  받아서  압축을  풀었다.  여러  폴더와  파일들이  있다.  필자는  윈도우를  사용하고  있다.  혹시  다른  운영체제를  사용한다면  문서들을  살펴보길  바란다.


NetComponents.jar  파일을  클래스패스에  추가하자.  클래스패스에  추가하는  방법을  모르는  분들은  다른  자바  기초  서적을  참고하시길…  Doc  폴더에는  API  도움말이  있고  examples  폴더에는  여러  예제가  있다.  눈치  빠른  개발자들이라면  예제  파일을  본  후에  NetComponents가  아주  많은  프로토콜을  지원한다는  것을  쉽게  예상  할  수  있을  것이다.  공짜로  사용하는  것  치고는  아주  많은  기능을  제공한다.  여유가  되는  분들은  다른  기능도  사용해보고  이에  대한  기사  올려준다면  다른  개발자들에게  큰  힘이  될  것이  분명하다.  물론  예제에는  FTP도  포함되어  있으며(ftp.java)  본  기사에서도  이  예제를  참고할  것이다.

어떤  기능을  개발할  것인가?

프  로그램을  개발하기  위해서는  어떤  것을  개발할  것인지,  어떤  기능을  수행해야  하는지를  명확히  알아야  한다.  이런  것들을  소프트웨어  공학에서는  “요구  사항”  이라고  한다.  요구  사항이  명확히  정의  되지  않으면  개발  도중에  많은  실수를  반복하고  기간이  늘어나기  쉽상이지만  우리가  개발할  프로그램의  요구  사항은  아래와  같이  간단하다.
FTP  서버에  접속한다.
정해진  디렉토리로  이동한다.
디렉토리  내의  사이즈가  0보다  큰  모든  로그  파일들을  가져온다.
혹시  다른  기능이  더  필요하다면  API  도움말을  참고하면  된다.  적절한  클래스와  메소드들을  사용해서  상용  FTP  클라이언트  프로그램들이  제공하는  기능은  대부부분  구현이  가능하다.

소스코드

코  드  자체는  그리  어려운  부분이  없으므로  따로  설명이  필요할  것이  없다.  기능  자체가  워낙  간단해서인가?  여러분들은  그저  중간에  간단히  적힌  주석  부분만  참고하면  될  것이다.  컴파일을  하고  실행을  하면  화면에서는  나타나는  것이  없지만  실제로  파일이  전송된다.  여러분도  적절히  수정을  하여  원하는  파일들을  서버로부터  전송  받을  수  있을  것이다.
import  java.io.*;

import  com.oroinc.net.ftp.*;
import  com.oroinc.net.*;

public  class  MyFtpClient  {
static  String  server  =  "xxxxx";
static  int  port  =  21;
static  String  id  =  "xxxxx";
static  String  password  =  "xxxxx";
FTPClient  ftpClient;

public  MyFtpClient(String  server,  int  port,  String  id,  String  password)  {
this.server  =  server;
this.port  =  port;
ftpClient  =  new  FTPClient();
}

public  static  void  main(String  args[])  {
MyFtpClient  ftp  =  new  MyFtpClient(server,  port,  id,  password);
ftp.connect();
ftp.login(ftp.id,  ftp.password);
//  로그파일이  있는  디렉토리로  이동한다
ftp.cd("/home/ems/emsprj/project/wos/WosLog/log");
FTPFile[]  files  =  ftp.list();
for  (int  i  =  0;  i  <  files.length  ;  i++)  {
String  fileName  =  files.getName();
//  파일  이름에서  확장자만  추출
String  extension  =  fileName.substring(fileName.lastIndexOf(".")  +  1);
long  size  =  files.getSize();
//  파일  사이즈가  0보다  크고  로그  파일만  가져온다
if  (  (size  >  0)  &&  (extension.equalsIgnoreCase("log"))  )  {
File  file  =  ftp.get(fileName,  fileName);
}
}
ftp.logout();
ftp.disconnect();
System.exit(1);
}

//  계정과  패스워드로  로그인
public  boolean  login(String  user,  String  password)  {
try  {
this.connect();
return  ftpClient.login(user,  password);
}
catch  (IOException  ioe)  {
ioe.printStackTrace();
}
return  false;
}

//  서버로부터  로그아웃
private  boolean  logout()  {
try  {
return  ftpClient.logout();
}
catch  (IOException  ioe)  {
ioe.printStackTrace();
}
return  false;
}

//  서버로  연결
public  void  connect()  {
try  {
ftpClient.connect(server,  port);
int  reply;
//  연결  시도후,  성공했는지  응답  코드  확인
reply  =  ftpClient.getReplyCode();
if(!FTPReply.isPositiveCompletion(reply))  {
ftpClient.disconnect();
System.err.println("서버로부터  연결을  거부당했습니다");
System.exit(1);
}
}
catch  (IOException  ioe)  {
if(ftpClient.isConnected())  {
try  {
ftpClient.disconnect();
}  catch(IOException  f)  {
//
}
}
System.err.println("서버에  연결할  수  없습니다");
System.exit(1);
}
}

//  FTP의  ls  명령,  모든  파일  리스트를  가져온다
public  FTPFile[]  list()  {
FTPFile[]  files  =  null;
try  {
files  =  this.ftpClient.listFiles();
return  files;
}
catch  (IOException  ioe)  {
ioe.printStackTrace();
}
return  null;
}

//  파일을  전송  받는다
public  File  get(String  source,  String  target)  {
OutputStream  output  =  null;
try  {
File  local  =  new  File(source);
output  =  new  FileOutputStream(local);
}
catch  (FileNotFoundException  fnfe)  {
fnfe.printStackTrace();
}
File  file  =  new  File(source);
try  {
if  (ftpClient.retrieveFile(source,  output))  {
return  file;
}
}
catch  (IOException  ioe)  {
ioe.printStackTrace();
}
return  null;
}

//  서버  디렉토리  이동
public  void  cd(String  path)  {
try  {
ftpClient.changeWorkingDirectory(path);
}
catch  (IOException  ioe)  {
ioe.printStackTrace();
}
}

//  서버로부터  연결을  닫는다
private  void  disconnect()  {
try  {
ftpClient.disconnect();
}
catch  (IOException  ioe)  {
ioe.printStackTrace();
}
}

}
참고문헌


http://www.terms.co.kr/FTP.htm
http://java.sun.com/products/jdk/faq/faq-sun-packages.html
http://www.savarese.org/java/index.html  

2668 view

4.0 stars