yoni

[34][Network] Runnable 인터페이스 기반 파일 전송, Client 본문

java of educational by contents

[34][Network] Runnable 인터페이스 기반 파일 전송, Client

yoni-1117 2018. 12. 15. 13:48

[01]  Runnable 인터페이스 기반 파일 전송, Client

- 서버 폴더: C:/201812_java/file/server     ← Client로부터 전송받아 저장하는 곳
- Client 폴더: C:/201812_java/file/client    ← 서버로 전송할 sample 이미지 저장하는 곳

1. 안정성 향상을 위해 서버와 Client는 sleep 및 buffer 용량을 동일하게 해줍니다.
    byte[] buffer = new byte[4096];  
    Thread.sleep(100); // 0.1 초 

 

[실행 화면]

/oop/bin>java network.UploadServer
파일 수신 대기 중입니다...
──────────────────
접속됨: /127.0.0.1
파일 수신 대기 중입니다...
──────────────────
스위스.jpg 파일을 수신 받습니다.
##############################
##############################
##############################
##############################
##############################
##############################
##############################
##############################
########################
──────────────────
파일 수신을 완료했습니다.
──────────────────

 
/oop/bin>java network.UploadClient 127.0.0.1 sw06.jpg
스위스.jpg을 전송 시작합니다.
──────────────────
스위스.jpg을 전송 완료했습니다.
──────────────────


 
1) 파일을 전송 받는 Server

▷ UploadServer.java
-----------------------------------------------------------------------------------
package network;
 
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
 
/**
C: 
CD/ 
CD 201812_java/ws_java/oop/bin
java network.UploadServer
*/
public class UploadServer {
  public static void main(String[] args) {
    ServerSocket serverSocket = null;
    try {
      serverSocket = new ServerSocket(2010);
      while (true) {
        System.out.println("파일 수신 대기 중입니다...");
        System.out.println("──────────────────");
        Socket socket = serverSocket.accept();//접속
        System.out.println("접속됨: " + socket.getInetAddress());
        Thread serverThread = new Thread(new ServerThread(socket));//쓰레드만듦 객체를 만들면서 쓰레드를 전송
        serverThread.start();//시작
      }
    } catch (IOException ioe) {
      ioe.printStackTrace();
    } finally {
      try {
        serverSocket.close();
      } catch (IOException e) {
      }
    }
  }
}
 
class ServerThread implements Runnable {
  Socket socket;
 
  public ServerThread(Socket socket) {
    this.socket = socket;
  }
 
  public void run() {
    try {
      BufferedInputStream up = new BufferedInputStream(socket.getInputStream());
      DataInputStream fromClient = new DataInputStream(up);//DataInputStream는 한글처리능력이없다-> 비영어권을 위한 클래스임
      String filename = fromClient.readUTF();// 텍스트를 입력 받음
      System.out.println(filename + " 파일을 수신 받습니다.");
 
      FileOutputStream toFile = new FileOutputStream("C:/201812_java/file/server/" + filename);//FileOutputStream 
      BufferedOutputStream outFile = new BufferedOutputStream(toFile);
 
      int count = 0;
      byte[] buffer = new byte[4096];  //4키로씩 읽어서
 
      while ((up.read(buffer)) > 0) {//출력함
        Thread.sleep(50); // 0.05 초 마다
        System.out.print("#");
        count++;
        if (count % 30 == 0) {
          System.out.println();
        }
        outFile.write(buffer);
        outFile.flush();
      }
 
      try {
        outFile.close();
      } catch (IOException e) {
      }
      
      try {
        fromClient.close();
      } catch (IOException e) {
      }
      
      try {
        up.close();
      } catch (IOException e) {
      }
      
      try {
        socket.close();
      } catch (IOException e) {
      }
      
      System.out.println();
      System.out.println("──────────────────");      
      System.out.println("파일 수신을 완료했습니다.");
      System.out.println("──────────────────");      
    } catch (FileNotFoundException fnfe) {
      fnfe.printStackTrace();
    } catch (IOException ioe) {
      ioe.printStackTrace();
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally{
      try {
        socket.close();
      } catch (IOException e) {
      }
    }
  }
}
 
 
 
 
-----------------------------------------------------------------------------------


2) 파일을 전송 하는 Client

▷ UploadClient.java
-----------------------------------------------------------------------------------
package network;
 
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.Socket;
 
/**
C:
CD/
CD 201812_java/ws_java/oop/bin
java network.UploadClient 127.0.0.1 sw06.jpg
 
*/
public class UploadClient {
  public static void main(String[] args) throws Exception {
    Socket socket = new Socket(args[0], 2010);
    String filename = null;
    BufferedOutputStream toServer = null;
    BufferedInputStream bis = null;
    FileInputStream fis = null;
    DataOutputStream dos = null;
    File file = null;
 
    try {
      filename = args[1];
      file = new File("C:/201812_java/swiss/" + filename);
      if (file.exists() == false) {
        System.out.println("파일이 존재하지 않습니다.");
      } else{
        toServer = new BufferedOutputStream(socket.getOutputStream());
        dos = new DataOutputStream(socket.getOutputStream());
        dos.writeUTF(filename);//파일명 전송
        System.out.println(filename + "을 전송 시작합니다.");
        System.out.println("──────────────────");
        fis = new FileInputStream(file);
        bis = new BufferedInputStream(fis);
        byte[] buffer = new byte[4096];
        int count = 0;        
 while ((bis.read(buffer)) > 0) { // -1은 파일을 전부 읽음.
          Thread.sleep(50); // 0.05 초
          System.out.print("#");
          count++;
          if (count % 30 == 0) {
            System.out.println();
          }
          toServer.write(buffer);
          toServer.flush();
        }
        
        try {
          bis.close();
        } catch (IOException e) {
        }
        try {
          fis.close();
        } catch (IOException e) {
        }
        try {
          dos.close();
        } catch (IOException e) {
        }
        try {
          toServer.close();
        } catch (IOException e) {
        }
        
        System.out.println();
        System.out.println(filename + "을 전송 완료했습니다.");
      }
 
      socket.close();
      System.out.println("──────────────────");
    } catch (FileNotFoundException fnfe) {
      fnfe.printStackTrace();
    } catch (IOException ioe) {
      ioe.printStackTrace();
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
      try {
        socket.close();
      } catch (IOException e) {
      }
    }
  }
}
 
 
-----------------------------------------------------------------------------------
->답 ▷ UploadServer.java
-----------------------------------------------------------------------------------
package network;
 
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
 
/**
C: 
CD/ 
CD 201812_java/ws_java/oop/bin
java network.UploadServer
*/
public class UploadServer {
  public static void main(String[] args) {
    ServerSocket serverSocket = null;
    try {
      serverSocket = new ServerSocket(2010);
      while (true) {
        System.out.println("파일 수신 대기 중입니다...");
        System.out.println("──────────────────");
        Socket socket = serverSocket.accept();
        System.out.println("접속됨: " + socket.getInetAddress());
        Thread serverThread = new Thread(new ServerThread(socket));
        serverThread.start();
      }
    } catch (IOException ioe) {
      ioe.printStackTrace();
    } finally {
      try {
        serverSocket.close();
      } catch (IOException e) {
      }
    }
  }
}
 
class ServerThread implements Runnable {
  Socket socket;
 
  public ServerThread(Socket socket) {
    this.socket = socket;
  }
 
  public void run() {
    try {
      BufferedInputStream up = new BufferedInputStream(socket.getInputStream());
      DataInputStream fromClient = new DataInputStream(up);
      String filename = fromClient.readUTF(); // 텍스트 입력
      System.out.println(filename + " 파일을 수신 받습니다.");
 
      FileOutputStream toFile = new FileOutputStream("C:/201812_java/file/server/" + filename);
      BufferedOutputStream outFile = new BufferedOutputStream(toFile);
 
      int count = 0;
      byte[] buffer = new byte[4096];  
 
      while ((up.read(buffer)) > 0) {
        Thread.sleep(50); // 0.05 초 
        System.out.print("#");
        count++;
        if (count % 30 == 0) {
          System.out.println();
        }
        outFile.write(buffer);
        outFile.flush();
      }
 
      try {
        outFile.close();
      } catch (IOException e) {
      }
      
      try {
        fromClient.close();
      } catch (IOException e) {
      }
      
      try {
        up.close();
      } catch (IOException e) {
      }
      
      try {
        socket.close();
      } catch (IOException e) {
      }
      
      System.out.println();
      System.out.println("──────────────────");      
      System.out.println("파일 수신을 완료했습니다.");
      System.out.println("──────────────────");      
    } catch (FileNotFoundException fnfe) {
      fnfe.printStackTrace();
    } catch (IOException ioe) {
      ioe.printStackTrace();
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally{
      try {
        socket.close();
      } catch (IOException e) {
      }
    }
  }
}
 
 
 
 
-----------------------------------------------------------------------------------


2) 파일을 전송 하는 Client

▷ UploadClient.java
-----------------------------------------------------------------------------------
package network;
 
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.Socket;
 
/**
C:
CD/
CD 201812_java/ws_java/oop/bin
java network.UploadClient 127.0.0.1 sw06.jpg
 
*/
public class UploadClient {
  public static void main(String[] args) throws Exception {
    Socket socket = new Socket(args[0], 2010);
    String filename = null;
    BufferedOutputStream toServer = null;
    BufferedInputStream bis = null;
    FileInputStream fis = null;
    DataOutputStream dos = null;
    File file = null;
 
    try {
      filename = args[1];
      file = new File("C:/201812_java/file/client/" + filename);
      if (file.exists() == false) {
        System.out.println("파일이 존재하지 않습니다.");
      } else{
        toServer = new BufferedOutputStream(socket.getOutputStream());
        dos = new DataOutputStream(socket.getOutputStream());
        dos.writeUTF(filename); // 파일명 전송
        System.out.println(filename + "을 전송 시작합니다.");
        System.out.println("──────────────────");
        fis = new FileInputStream(file);
        bis = new BufferedInputStream(fis);
 
        int count = 0;        
        byte[] buffer = new byte[4096];
        
        while ((bis.read(buffer)) > 0) { // -1 파일을 전부 읽음.
          Thread.sleep(50); // 0.05 초
          System.out.print("#");
          count++;
          if (count % 30 == 0) {
            System.out.println();
          }
          toServer.write(buffer);
          toServer.flush();
        }
        
        try {
          bis.close();
        } catch (IOException e) {
        }
        try {
          fis.close();
        } catch (IOException e) {
        }
        try {
          dos.close();
        } catch (IOException e) {
        }
        try {
          toServer.close();
        } catch (IOException e) {
        }
        
        System.out.println();
        System.out.println(filename + "을 전송 완료했습니다.");
      }
 
      socket.close();
      System.out.println("──────────────────");
    } catch (FileNotFoundException fnfe) {
      fnfe.printStackTrace();
    } catch (IOException ioe) {
      ioe.printStackTrace();
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
      try {
        socket.close();
      } catch (IOException e) {
      }
    }
  }
}
 
  
 
-----------------------------------------------------------------------------------


Comments