개발자 성장 일지

2022.03.23 IO를 활용한 파일 보내기

NEWDODORIPYO 2022. 3. 23. 18:02

이번 주는 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