이번 주는 IO(입출력)에 대해서 진도를 나가고 있습니다 IO의 관련된 개념들을 배우고 코드를 작성하는 것을 반복하고 있습니다 익숙해지기 위해서 한 주제 <IO>로 3일이나 이어갔다는 건 그만큼 웹으로 가기 위해서는 IO의 개념이 잘 잡혀있어야 한다는 뜻으로 느껴지네요
IO의 관련된 개념들은 따로 정리하고 이번글에서는 코드 리뷰를 해보겠습니다
이번 코드는 Client 가 Server 에게 요청하면 Server이 가지고 있는 파일을 보내는 로직을 만들어보았습니다
Server
import lombok.Cleanup;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class FileSendServer {
//bad code
public static void main(String[] args) throws Exception {
//서버 소켓 열기
@Cleanup ServerSocket serverSocket = new ServerSocket(5555);
System.out.println("ready.....");
while (true){
//소켓 연결
@Cleanup Socket socket = serverSocket.accept();
System.out.println(socket);
//DataOutputStream 을 보통 dos라 부른다
@Cleanup DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
//파일 이름 UTF로 인코딩해서 보내기
dos.writeUTF("광화문 국밥.jpg");
//파일 보내는 공간&속도 8kb
byte[] buffer = new byte[1024*8];
//경로의 파일을 input 가져온다
FileInputStream fin = new FileInputStream("C:\\zzz\\ass.jpg");
//
while (true){
int count = fin.read(buffer);
if(count==-1){break;}
//파일 보내기
dos.write(buffer,0,count);
}
}//end wile
}
}
기존에 만들던 IO로직들은 InputStream/OutputStream 을 사용했었는데 오늘은 DataOutputStream/InputOutStream을 사용했습니다 파일을 보내는 로직은 전에도 한번 만들어본 적이 있는데 그때의 로직은 Client는 Server 이 어떤 이름의 파일을 보내는지를 알수가없었습니다 하지만 이번에는 DataOutputStream 그리고 UTF 를 통해서 파일의 제목까지도 같이 줄 수 있게 되었습니다
Client
import lombok.Cleanup;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.net.Socket;
public class FileGetter {
public static void main(String[] args) throws Exception{
@Cleanup Socket socket =new Socket("ip" ,5555);
// DataInputStream 을 din 으로 보통 부른다
@Cleanup DataInputStream din = new DataInputStream(socket.getInputStream());
//Server 에서 보낸 UTF 문자열 읽기
String fileName = din.readUTF();
//input으로 가져온 파일을 지정된 경로에 output 복사한다
FileOutputStream fos = new FileOutputStream("C:\\zzz\\"+fileName);
// 8kb의 속도&공간 으로
byte[] buffer = new byte[1024*8];
//읽기
while (true){
//읽어 오는 파일
int count = din.read(buffer);
//파일이 -1 일때 <끝났을때> break;
if(count==-1){break;}
//파일 0~count 까지 복사
fos.write(buffer,0,count);
}
}
}
서버를 작동시킨뒤 socket의 ip를 입력하면 파일을 받아 올 수 있는 로직이 완성되었습니다!!
이번 로직에서 새롭게 사용된 개념들은 따로 정리해서 올려보도록 하겠습니다
'개발자 성장 일지' 카테고리의 다른 글
2022.03.24 수업일지 (0) | 2022.03.24 |
---|---|
2022.03.23 채팅 IO (0) | 2022.03.23 |
2022.03.21 다양한 예외 처리 (0) | 2022.03.21 |
2022.03.21 예외 처리 (0) | 2022.03.21 |
2022.03.18 입출력 속도 (0) | 2022.03.20 |