ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

     

    OdysseyJ/SocketProgramming

    Contribute to OdysseyJ/SocketProgramming development by creating an account on GitHub.

    github.com

    전체 코드

    [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();
    	}
    }
    
Designed by Tistory.