FTP (File Transfer Protocol) ; 파일 전송 프로토콜간단히 말해서 FTP는 파일 전송 프로토콜이다. 우리는 FTP라는 프로토콜을 알게 모르게 많이 사용하고 있다. 회사 동료들 사이에 문서를 주고 받거나, 친구들과 음악 파일, 동영상 등을 주고 받는데 항상 사용하고 있는 것이다. 일반 컴퓨터 사용자들은 프로토콜이니 그런 것에는 관심 없을 것이다. 내가 원하는 파일을 주고 받기만 하면 될 뿐이니까… 그래도 FTP를 사용하기 위해서는 기본 명령을 알아야 한다. 하지만 이런 기본 명령 조차도 귀찮을 다름이다.
FTP[에프 티 피]는 인터넷상의 컴퓨터들간에 파일을 교환하기 위한 표준 프로토콜로서 가장 간단한 방법이기도 하다. 화면에 표시할 수 있는 웹 페이지와 관련 파일들을 전송하는 HTTP (Hypertext Transfer Protocol), 전자우편을 전송하는 SMTP (Simple Mail Transfer Protocol)등과 같이, FTP도 역시 인터넷의 TCP/IP 응용 프로토콜 중의 하나이다. FTP는 웹 페이지 파일들을 인터넷상에서 모든 사람이 볼 수 있도록 하기 위해 저작자의 컴퓨터로부터 서버로 옮기는 과정에서 사용된다. 또한, 다른 서버들로부터 자신의 컴퓨터로 프로그램이나 파일들을 다운로드 하는 데에도 많이 사용된다.
사용자 입장에서는 간단한 명령어를 통하여 FTP를 쓰거나, 또는 그래픽 사용자 인터페이스를 제공하는 상용 프로그램을 쓸 수도 있다. 보통은 웹 브라우저도 웹 페이지로부터 선택한 프로그램을 다운로드 하는데 FTP를 사용한다. FTP를 사용하여 서버에 있는 파일을 지우거나 이름을 바꾸거나 옮기거나 복사하는 등 갱신작업을 할 수도 있다. FTP 서버에는 로그온을 해야 하지만, 익명의 FTP를 사용하여 모든 사람들에게 공개된 파일들을 쉽게 접근할 수 있도록 하고 있다.
FTP는 보통 TCP/IP에 함께 딸려오는 일련의 프로그램 속에 포함되어 있다.
NetComponents.jar 파일을 클래스패스에 추가하자. 클래스패스에 추가하는 방법을 모르는 분들은 다른 자바 기초 서적을 참고하시길… Doc 폴더에는 API 도움말이 있고 examples 폴더에는 여러 예제가 있다. 눈치 빠른 개발자들이라면 예제 파일을 본 후에 NetComponents가 아주 많은 프로토콜을 지원한다는 것을 쉽게 예상 할 수 있을 것이다. 공짜로 사용하는 것 치고는 아주 많은 기능을 제공한다. 여유가 되는 분들은 다른 기능도 사용해보고 이에 대한 기사 올려준다면 다른 개발자들에게 큰 힘이 될 것이 분명하다. 물론 예제에는 FTP도 포함되어 있으며(ftp.java) 본 기사에서도 이 예제를 참고할 것이다.
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[i].getName(); // 파일 이름에서 확장자만 추출 String extension = fileName.substring(fileName.lastIndexOf(".") + 1); long size = files[i].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(); } } }참고문헌
이전 글 : 진정한 의미의 서비스
최신 콘텐츠