package demo.file;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import org.apache.commons.io.IOUtils;

public class FileServer {

	public static void main(String[] args) throws Exception {
		
		// 클라이언트의 연결 요청을 처리할 ServerSocket 생성
		ServerSocket server = new ServerSocket(8000);
		System.out.println("서버가 시작되었습니다.");
		while (true) {
			// 클라이언트의 연결요청이 접수되면 그 클라이언트와 통신할 소켓을 제공받는다.
			Socket socket = server.accept();
			
			// 소켓으로부터 입력스트림/출력스트림 획득
			InputStream in = socket.getInputStream();
			OutputStream out = socket.getOutputStream();
			
			// 위에서 획득한 스트림을 문자열, 정수, 파일데이터를 송수신할 수 있는
			// 보조스트림(DataInpuStream, DataOutputStream)과 연결
			DataInputStream dis = new DataInputStream(in);
			DataOutputStream dos = new DataOutputStream(out);
			
			// 클라이언트가 보낸 문자열, 정수 읽어오기
			String filename = System.currentTimeMillis() + dis.readUTF();
			long filesize = dis.readLong();
			
			// 클라이언트가 보낸 파일을 저장할 스트림 생성하기
			FileOutputStream fos = new FileOutputStream("c:/temp/" + filename);
			System.out.println("["+filename+"] 저장을 시작");
			
			// 클라이언트가 보낸 파일데이터 읽어서 파일로 저장하기
			int readSize = 0;						// 읽어온 파일 데이터를 크기를 저장할 변수
			int len = 0;
			byte[] buf = new byte[1024];
			while ((len=dis.read(buf)) != -1) {		// 1. 스트림으로부터 데이터 읽기
				fos.write(buf, 0, len);				// 2. 파일에 기록하기
				readSize += len;                    // 3. 읽어들인 파일 데이터 크기를 증가시키기
				if (readSize == filesize) {         // 4. 읽어들인 파일의 크기와 파일 사이즈가 일치하면 반복 탈출
					break;
				}
			}
			fos.close();
			System.out.println("["+filename+"] 저장이 완료");
			
			dos.writeUTF("["+filename+"]의 저장이 완료되었습니다.");
			dos.flush();			
		}
	}
}​

 

package demo.file;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

import org.apache.commons.io.IOUtils;

public class FileClient {

	public static void main(String[] args) throws Exception {
		// 소켓을 생성해서 서버에 연결요청하기
		Socket socket = new Socket("192.168.10.254", 8000);
		
		// 소켓으로부터 입력스트림/출력스트림 획득하기
		OutputStream out = socket.getOutputStream();
		InputStream in = socket.getInputStream();
		
		// 소켓으로부터 획득한 스트림을 보조스트림과 연결하기
		DataOutputStream dos = new DataOutputStream(out);
		DataInputStream dis = new DataInputStream(in);
	
		File file = new File("c:/temp/suyoung.jpg");
		String filename = file.getName();                // 파일 이름 획득
		long filesize = file.length();                   // 파일 사이즈 획득
		FileInputStream fis = new FileInputStream(file); // 파일 데이터 획득을 위한 입력 스트림 생성
		
		// 서버로 파일명, 파일사이즈, 파일데이터 보내기
		dos.writeUTF(filename);
		dos.writeLong(filesize);
		IOUtils.copy(fis, dos); // FileInputStream으로 읽어서 DataOutputStream으로 복사
		
		// 서버로부터 메시지 받기
		String message = dis.readUTF();
		System.out.println("응답 메시지 : " + message);
		
		socket.close();
		
	}
}

 

'자바 > network' 카테고리의 다른 글

sync  (0) 2019.06.10
store  (0) 2019.06.10
simpleClient  (0) 2019.06.10
mallClient  (0) 2019.06.10
chat  (0) 2019.06.10

+ Recent posts