-
[Network] TCP Socket Programming - File Download [Server - Client]프로그래밍 2019. 11. 13. 20:36
서버-클라이언트간 TCP Socket을 사용해 파일을 다운로드하는 예제입니다.
Client_Server/Server/files에 있는 test.pdf파일을
Client_Server/Client/files에 다운로드 받습니다.
구현환경 / 언어 : Mac / Java
사용법 : 맥을 기준으로 설명하겠습니다.
1. 2개의 터미널을 켜줍니다.
2. 하나의 터미널에서는 Client_Server폴더 내의 Client 폴더로 이동합니다.
다른 하나의 터미널에서는 Client_Server폴더 내의 Server폴더로 이동합니다.
3. 먼저, Server 폴더에서 Server_Peer.java 파일을 컴파일하고,
java Server_Peer 8000 test.pdf 를 통해 파일을 실행시킵니다.
이후, Client 폴더에서 Client_Peer.java 파일을 컴파일하고,
java Client_Peer 127.0.0.1 8000 test.pdf를 통해 파일을 실행시킵니다.
이후, Client_Server/Client/files폴더에 test.pdf파일이 생성되면 성공!
자세한 사용법 / 코드에 관한 설명은 깃허브 위키에 적어놓았습니다.
https://github.com/OdysseyJ/SocketProgramming/wiki/Assignment1
전체 코드
[Client_Server/Server/Server_Peer.java]
import java.io.*; import java.net.*; import java.nio.file.Path; import java.nio.file.Paths; public class Server_Peer { private static ServerSocket welcomeSocket; // First connected socket private static Socket connectionSocket; // Connected socket with client private static String file_dir = "files"; // Name of file directory private static int port; // Seeder's port number private static String filename; // File name private static byte[][] data; // Stores chunked data private static int chunkSize; // A chunk size private static int chunkNum; // The number of chunks in data // Cunking files with 10KB and save it to data[][] public static byte[][] file_chunking(File f) throws IOException { chunkSize = 1024 * 10; chunkNum = (int) Math.ceil((double) f.length() / chunkSize); // Calculate chunk number int numRead = 0; FileInputStream fis = new FileInputStream(f); BufferedInputStream bis = new BufferedInputStream(fis); data = new byte[chunkNum][]; for (int i = 0; i < chunkNum; i++) { data[i] = new byte[chunkSize]; } int chunkIndex = 0; // Read bytes from file while (chunkIndex < chunkNum && (numRead = bis.read(data[chunkIndex], 0, data[chunkIndex].length)) != -1) { chunkIndex++; } bis.close(); fis.close(); return data; } public static void main(String[] args) throws Exception { // exception handling if (args.length < 2) { System.err.println("[Usage]"); System.err.println("java Server_Peer <server's listening port number> <filename>"); System.exit(0); } port = Integer.parseInt(args[0]); filename = args[1]; // Directory path where file exist. Path p = Paths.get(System.getProperty("user.dir"), file_dir); File sendFile = new File(p.toString(), filename); if (!sendFile.exists()) { System.out.println("There is no " + filename + " in files directory"); } // File Chunking by 10KB and save it to data. data = file_chunking(sendFile); System.out.println("=============================================================="); System.out.println(" Server_Peer Start "); System.out.println("=============================================================="); Thread.sleep(1000); System.out.println("=============================================================="); System.out.println(" Waiting Clients Connection "); System.out.println("=============================================================="); // Socket Start welcomeSocket = new ServerSocket(port); // Listen port and waiting clients connection. connectionSocket = welcomeSocket.accept(); System.out.println("Peer connected in port " + port); // Create outputStream and send data to socket. OutputStream OutputStream = connectionSocket.getOutputStream(); for (int i = 0; i < data.length; i++) { OutputStream.write(data[i]); } System.out.println("Send Completed"); System.out.println("Send " + chunkNum + " chunks to client"); OutputStream.close(); welcomeSocket.close(); connectionSocket.close(); } }
[Client_Server/Client/Client_Peer.java]
import java.io.*; import java.net.*; public class Client_Peer { private static Socket socket; // Connected socket with server private static int chunkSize = 1024 * 10; // File chunk size private static int chunkNum = 0; // To count chunks public static void main(String[] args) throws Exception { // exception handling if (args.length < 3) { System.err.println("[Usage]"); System.err.println("java Client_Peer <server's ip> <server's listening port number> <filename>"); System.exit(0); } String serverIP = args[0]; int port = Integer.parseInt(args[1]); String fileName = args[2]; System.out.println("=============================================================="); System.out.println(" Client_Peer Start "); System.out.println("=============================================================="); // Create file output stream to make file FileOutputStream fos = new FileOutputStream("files/" + fileName); // Create Socket socket = new Socket(serverIP, port); if (!socket.isConnected()) { System.out.println("Socket Connect Fail"); System.exit(0); } System.out.println("Connected to Server (" + serverIP + ":" + port + ")"); System.out.println("Download Start " + fileName); // Create inpusStream and get files InputStream InputStream = socket.getInputStream(); byte[] buffer = new byte[chunkSize]; int readBytes; while ((readBytes = InputStream.read(buffer)) != -1) { fos.write(buffer, 0, readBytes); chunkNum++; } System.out.println("Client receive " + chunkNum + " chunks to Server"); System.out.println("Download End " + fileName); socket.close(); fos.close(); InputStream.close(); } }
'프로그래밍' 카테고리의 다른 글
[nodejs] Request모듈을 이용해서 html을 불러올 때 깨지는 문제 해결(cheerio, iconv-lite, request, charset) (0) 2019.11.27 [Docker] Docker(도커)+NodeJs(Sequelize)+Mysql 연동하기 / Docker-Compose 구성 및 Docker-Compose 순서 설정. (0) 2019.11.11 [자료구조] 이진탐색트리(Binary Search Tree, BST)의 시간복잡도 (0) 2019.08.14 [자료구조] 자바로 트리(Tree) 구현하기, 트리의 탐색 (0) 2019.08.08 [자료구조] JAVA로 그래프(Graph)구현하기, BFS, DFS (0) 2019.08.07