[JAVA] 12강 Server & Client 코드리뷰

KDH59·2024년 2월 9일

[JAVA]

목록 보기
12/13

public class Receiver { // Server

public static void main(String[] args) throws IOException {
	
	// 서버소켓 생성
	ServerSocket server = new ServerSocket(7777);
	
	while(true) {// 접속 대기
		System.out.println("접속 요청 대기");
		Socket socket = server.accept();
		// 클라이언트에서 보내온 스트림 수신
		InputStream is = socket.getInputStream();
		BufferedInputStream bis = new BufferedInputStream(is);
		ObjectInputStream ois = new ObjectInputStream(bis);
		
		String fileName = ois.readUTF();
		
		// 내 PC 의 특정 경로로 저장
		FileOutputStream fos = new FileOutputStream("C:/Users/goodee/Downloads/"+fileName);
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		System.out.println("파일 저장 시작");
		int data;
		while((data=ois.read()) != -1) {
			bos.write(data);
		}
		System.out.println("파일 저장 완료");			
		// 자원 반납	
		bos.flush();
		ois.close();
		bos.close();
		socket.close();
	}


}

}

Receiver (server)

우선 처음으로 클라이언트가 들어갈 포트을 개방하는 역할을 하기 위해

서브 소캣을 생성

while문을 통해 클라이언트에서 보내온 스트림을 수신할수 있도록 요청하는데 수신 받을 때만 실행하도록 server.accpept을 사용하여 수신 받을때만 실행하도록 브레이크을 걸어준다

클라이언트 에서 보내온 정보를 수신하기 위해 스트림을 이용하며

소켓에 있는 정보는 getInput 스트림을 사용하여 스트림으로 읽어 온 정보를 input스트림 is에 저장하는데

보조스트림인 Buffered인풋스트림을 통하여 데이터를 읽어오는 속도 향상도 시키며

Object인풋스트림을 통해서는 객체와 파일, 파일이름이 된 내용들이 타입 상관 없이 그대로 읽어 올 수 있도록 기능한다.

String fileName
ObjectInputStream을 객체를 사용하여 ois 데이터 타입을 그대로 가져와 filename에 저장한다.

fIle아웃풋스트림을 통해 다운로드 될 경로를 특정해주며
bufferd아웃풋 스트림을 사용하여 속도 향상 된 데이터를 내보내준다.

int data; 를 생성한 후
while 문을 이용해 data 값이 보내온 스트림 ois의 데이터을 전부 읽어 -1이 될때까지 반복문을 요청하며
(-1이 반환되는 이유는 더이상 읽을 값이 없을 때 -1를 반환)
write를 통해 bos를 하나하나씩 내본낸다

이후 자원 정리를 위해 자원을 반납한다.

sender(cilent) 코드리뷰

public static void main(String[] args) throws Exception {

Socket socket = new Socket("192.168.70.138",7777);// 서버 연결

// 내 PC 에서 파일 불러오기
File file = new File("C:/img/high.gif");//파일객체
String fileName = file.getName();// 파일 이름
long size = file.length();// 크기(byte)

FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);

// 소켓을 이용하여 스트림 추출
OutputStream os = socket.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(os);
ObjectOutputStream oos = new ObjectOutputStream(bos);

oos.writeUTF(fileName);// 파일명 전송
byte[] arr = new byte[(int) size];
int data = bis.read(arr); // 배열에 데이터가 담기고, 얼마만큼의 크기에 담겼는지 반환
System.out.println("한번에 읽은 크기 : "+data);

oos.write(arr); // 바이트 전송
System.out.println("전송 완료 : 크기("+(size/1024)+"KB)");

/*
int data;
while((data=bis.read()) != -1) {			
	bos.write(data);// 내 PC 에서 읽어온 내용 내보내기
}
*/
oos.flush();
bis.close();
oos.close();		
socket.close();// 자원 반납

}

sender (Client)

서버와의 연결을 위해 소켓을 생성하며 소켓에는 해당 IP와 Port를 지정 후 연결해준다.

파일 객체를 파일로 저장하며
파일 이름을 file.getname를 이용하여 filename에 저장
long 사이즈에 file.lenght를 사용하여 크기를 저장한다.

이후 파일 객체를 스트림화 하여 내보내기 위해 하기 위해 통로역활을 지정해주고

소켓을 이용하여 스트림을 추출하는데
소캣에 있는 내용을 겟아웃풋스트림으로 추출하여 os에 저장
이후 추출 속도를 올려주기 위해 보조스트림 버퍼를 사용하며
오브젝트 스트림을 추가 사용하여 객체에 있는 내용을 있는 그대로 추출하도록 하는 기능을 추가한다.

writeUTF를 통해 파일명을 전송하며
int data를 배열로 데이터가 담겨진 arrfmf bis.read를 배열로 담아 전송하하며

oos. write(arr) 를 배열 형태로 바이트 전송 시킨다

이후
while을 사용하여 데이터를 다 전송할때까지 while 문으로 요청하며
bos.write를 통해 내 PC에서 읽어온 내용을 하나씩 내보낸다.

이후 자원 정리를 위해 자원 반납을 진행하며

profile
[JAVA]

0개의 댓글