TcpFileClient / TcpFileServer : 파일 저장

조수경·2021년 11월 18일
0

고급자바

목록 보기
53/97

TcpFileClient

package kr.or.didt.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.net.Socket;

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

/*
 * 서버와 클라이언트가 접속이 완료되면
 * 클라이언트가 'd:/d_other/멍멍.jpg'파일을 서버로 전송한다.
 * 서버는 클라이언트가 전송한 파일을 받아서 'd:/d_other/upload/' 폴더에
 * 같은 이름으로 저장되도록 한다.
 * 
 */

public class TcpFileClient {
	enum DialogChoice { OPEN, SAVE } 
	
	private void clientStart(){
		//파일을 읽어서 Socket으로 쓰기: 전송
		
		//File file = new File("d:/d_other/멍멍.jpg");
		File file =showDialog(DialogChoice.OPEN);
		
		if(file == null){
			System.out.println("전송한 파일을 선택하지 않았습니다.");
			System.out.println("작업을 중단합니다...");
			return;
		}
		
		String fileName = file.getName();
		if(!file.exists()){
			System.out.println(fileName + "파일이 없습니다.");
			System.out.println("작업을 중단 합니다...");
			return;
		}
		
		try {
			Socket socket = new Socket("localhost" , 7777);
			System.out.println("파일 전송 시작...");
			
			
			//Socket용 OutputStream 객체 생성
			DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
			BufferedOutputStream bos = new BufferedOutputStream(dos);
			
			// 서버에 접속하면 첫번째로 전송할 파일의 파일명을 전송한다.
			dos.writeUTF(fileName);
			
			
			//파일 입력용 InputStream 객체 생성
			BufferedInputStream bis = new BufferedInputStream(
					new FileInputStream(file)
			);
			
			byte[] temp = new byte[1024];
			int length = 0;
			
			// 파일 내용을 읽어와 소켓으로 전송하기
			while((length = bis.read(temp)) > 0){
				//읽어온 데이터 갯수가 0개보다 많으면 출력
				bos.write(temp, 0, length);
			}
			bos.flush();//현재 버퍼에 저장되어 있는 내용을 클라이언트로 전송하고 버퍼를 비운다.

			System.out.println("파일 전송 완료..");
			
			//스트림과 소켓 닫기
			bis.close();
			bos.close();
			socket.close();
			
			
		} catch (Exception e) {
			System.out.println("파일 전송 실패 : " + e.getMessage());
		}
		
	}
	

	public File showDialog(DialogChoice choice){
		// SWING의 파일 열기, 저장 창 연습
		JFileChooser chooser = new JFileChooser();
		
		// 선택할 파일의 확장자 설정
		FileNameExtensionFilter doc = 
				new FileNameExtensionFilter("Word File", "docx", "doc");
		FileNameExtensionFilter img =
				new FileNameExtensionFilter("Image File", new String[]{"png", "jpg", "gif"});
		FileNameExtensionFilter txt = 
				new FileNameExtensionFilter("text파일(.txt)", "txt");
		
		chooser.addChoosableFileFilter(doc);
		chooser.addChoosableFileFilter(img);
		chooser.addChoosableFileFilter(txt);
		
		// 확장자 목록 중 기본적으로 선택될 확장자 지정
		chooser.setFileFilter(txt); 
		
		// 모든 파일 목록 표시 여부 설정(true: 설정, false: 해제)
		//chooser.setAcceptAllFileFilterUsed(false);
		chooser.setAcceptAllFileFilterUsed(true);
		
		// Dialog창에 나타날 기본 경로 설정하기
		chooser.setCurrentDirectory(new File("d:/d_other"));
		int result = -1;
		if(choice==DialogChoice.OPEN){
			
			// 열기 창
			result = chooser.showOpenDialog(new Panel());//부모창?
		}else if(choice==DialogChoice.SAVE){
			// 저장 창
			result = chooser.showSaveDialog(new Panel());
		}
		// '열기 창' 또는 '저장 창'에서 선택한 파일 정보 가져오기
		
		
		File selectedFile = null;
		// '열기' 또는 '저장'버튼을 눌렀을 경우에는...
		if(result == JFileChooser.APPROVE_OPTION){ 
			// 선택한 파일 정보 구하기
			selectedFile = chooser.getSelectedFile();
			//System.out.println("선택 파일 : " + selectedFile.getAbsolutePath());
		}
		return selectedFile;
	}
	
	public static void main(String[] args) {
       new TcpFileClient().clientStart();
		
	}

}

TcpFileServer

package kr.or.didt.tcp;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpFileServer {

	private void serverStart(){
		//Socket으로 읽어서 file로 쓴다.
		File saveDir = new File("d:/d_other/upload/");
		
		if(!saveDir.exists()){ //저장할 폴더가 없으면 만들어준다.
			saveDir.mkdirs();
			
		}
		
		try {
			ServerSocket server = new ServerSocket(7777);
			System.out.println("서버가 준비중입니다...");
			
			Socket socket = server.accept(); // 클라이언트의 요청을 기다린다.
			
			System.out.println("파일 저장 시작...");
			
			//소켓용 입력 스트림 객체 생성
			DataInputStream dis = new DataInputStream(socket.getInputStream());
			BufferedInputStream bis = new BufferedInputStream(dis);
			
			//클라이언트가 접속되었을 때 첫번째로 보내온 파일이름을 받는다.
			String fileName = dis.readUTF();
			
			//File saveFile = new File(saveDir, "멍멍.jpg");
			File saveFile = new File(saveDir, fileName);
			
			/*
			InputStream is = socket.getInputStream();
			DataInputStream dis = new DataInputStream(is);
			BufferedInputStream bis = new BufferedInputStream(dis);
			*/
			
		
			//파일 출력용 스트림 객체 생성
			BufferedOutputStream bos = new BufferedOutputStream(
					new FileOutputStream(saveFile)
					);
			
			
			byte[] temp = new byte[1024];
			int length = 0;
			
			while((length = bis.read(temp)) > 0){
				bos.write(temp , 0, length);
				
			}
			bos.flush();
			
			System.out.println("파일 저장 완료...");
			
			
			//스트림과 소켓 닫기
			bos.close();
			bis.close();
			socket.close();
			server.close();
			
			
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("파일 저장 실패!!" + e.getMessage());
		}
		
	}
	
	public static void main(String[] args) {
       new TcpFileServer().serverStart();
		
		
	}

}
profile
신입 개발자 입니다!!!

0개의 댓글

관련 채용 정보