본문 바로가기
JAVA/NetworkTest

자바Network (TCP) TcpFileClient

by 미눅스[멘토] 2023. 6. 30.
728x90
package kr.or.ddit.basic.tcp;

import java.awt.Panel;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;


//클라이언트는 서버와 접속이 완료되면 'd:D_Other/'폴더에 있는
//'펭귄.jpg'파일을 서버로 전송한다.
//( 파일을 읽어서 소켓으로 출력하기)

public class TcpFileClient {

	public static void main(String[] args) throws UnknownHostException, IOException {
		TcpFileClient client = new TcpFileClient();
		
		
//		File file = new File("D:/D_Other/펭귄.jpg");
		File file = client.showDialog("OPEN");
		
		if(file==null) {
			System.out.println("전송할 파일을 선택하지 않았습니다.");
			return;
		}
		
		if(!file.exists()) {
			System.out.println(file.getPath() + "파일이 없습니다");
			System.out.println("복사 작업을 중지합니다.");
			return;
		}
		
		String fileName = file.getName(); //파일명 구하기
		
		try {
			Socket socket = new Socket("localhost", 7777);
			
			System.out.println("파일 전송 시작");
			
			// 처음에는 파일명을 문자열로 전송한다.
			DataOutputStream dout = new DataOutputStream(socket.getOutputStream());
			
			
			dout.writeUTF(fileName);
			
			//파일 내용을 읽어서 코켓으로 전송한다
			
			//파일 읽기용 스트림 갹체 생성
			BufferedInputStream bin = new BufferedInputStream(new FileInputStream(file));
			
			//소켓 출력용 스트림 객체 생성
			BufferedOutputStream bout = new BufferedOutputStream(dout);
			
			byte[] temp = new byte[1024];
			int length = 0;
			
			//파일 읽어서 소켓 전송하기
			while((length = bin.read(temp)) > 0 ) {
				bout.write(temp, 0 , length);
			}
			bout.flush();
			
			System.out.println("파일 전송 완료...");
			
			// 스트림과 소켓 닫기
			bout.close();
			bin.close();
			socket.close();
			
		} catch (Exception e) {
			System.out.println("파일 전송 실패!!!  --> " + e.getMessage());
		}
		
	} //main 메서드 끝
	
	// Dialog창을 열고 선택한 파일을 반환하는 메서드
	// option매개변수에는 "SAVE" 또는 "OPEN"값이 저장된다.
	private File showDialog(String option) {
		
		File selectedFile = null;
		
		// SWING의 파일 열기, 저장 창 연습
		
		JFileChooser chooser = new JFileChooser();
		
		//선택할 파일의 확장자 설정
		FileNameExtensionFilter txt = new FileNameExtensionFilter("Text파일(*.txt)", ".txt");
		FileNameExtensionFilter pdf = new FileNameExtensionFilter("pdf 파일", "pdf");
		FileNameExtensionFilter img = new FileNameExtensionFilter("이미지 파일", "png","jpg","gif");
		
		FileNameExtensionFilter doc = new FileNameExtensionFilter("MS Word파일", new String[] {"docx","doc"});
		
		
		chooser.addChoosableFileFilter(doc);
		chooser.addChoosableFileFilter(img);
		chooser.addChoosableFileFilter(pdf);
		chooser.addChoosableFileFilter(txt);
		
		
		chooser.setFileFilter(img);	//확장자 목록 중 기본적으로 선택될 확장자 지정
		
		// 모든 파일 목록의 표시 여부를 설정한다. ( true : 설정, flase : 미설정)
		chooser.setAcceptAllFileFilterUsed(true);
		
		// Dialog창에 나타날 기본 경로 설정하기 (예: 'd:/D_Other' 폴더로 설정하기)
		chooser.setCurrentDirectory(new File("d:/D_Other"));
		
		
		int result = -1;
		// 창 열기
		if("SAVE".equals(option.toUpperCase())) {
			result = chooser.showSaveDialog(new Panel()); //저장용 창
		}else if("OPEN".equals(option.toUpperCase())) {
			result = chooser.showOpenDialog(new Panel()); //열기용 창
		}
		
		
		
		// 창에서 파일을 선택한 후 '저장' 또는 '열기'버튼을 눌렀을 때 처리하기
		if(result == JFileChooser.APPROVE_OPTION) {
			selectedFile = chooser.getSelectedFile();
		}
		
		return selectedFile;
	}
}

'JAVA > NetworkTest' 카테고리의 다른 글

자바Network (TCP) TcpMultiChatClient (멀티채팅)  (0) 2023.06.30
자바Network (TCP) TcpFileServer  (0) 2023.06.30
자바Network (TCP) TcpClient02  (0) 2023.06.30
자바Network (TCP) TcpClient01  (0) 2023.06.30
자바Network (TCP) Sender  (0) 2023.06.30