[java] 자바 소켓 프로그래밍을 활용한 파일 공유 시스템 구현

이번 블로그에서는 자바 소켓 프로그래밍을 활용하여 파일 공유 시스템을 구현하는 방법에 대해 알아보겠습니다.

소켓 프로그래밍 소개

소켓 프로그래밍은 네트워크 통신을 위한 기술로, 클라이언트와 서버 사이의 통신을 가능하게 합니다. 소켓은 클라이언트와 서버 간의 양방향 통신을 담당하며, 데이터를 주고받을 수 있도록 합니다.

파일 공유 시스템 개요

이번에 구현할 파일 공유 시스템은 클라이언트가 파일을 서버에 업로드하고, 다른 클라이언트가 해당 파일을 다운로드할 수 있는 기능을 제공합니다. 클라이언트는 소켓을 통해 서버에 연결하고, 파일을 전송하거나 다운로드할 수 있습니다.

구현 방법

  1. 서버 구현 서버는 소켓을 통해 클라이언트의 요청을 받고, 요청에 따라 파일을 업로드하거나 전송합니다. 소켓을 생성하고 포트를 바인딩한 뒤, 클라이언트의 연결 요청을 기다립니다. 연결이 성공하면 클라이언트와의 통신을 위한 소켓을 생성하고, 클라이언트의 요청에 맞는 작업을 수행합니다. 예를 들어, 클라이언트가 파일을 업로드하라는 요청을 보내면, 서버는 파일을 받아 저장합니다.

  2. 클라이언트 구현 클라이언트는 서버에 연결하여 파일을 업로드하거나 다운로드합니다. 소켓을 생성하고 서버에 연결한 뒤, 서버에 요청을 보내 파일을 업로드하거나 다운로드합니다. 업로드 요청을 보낼 때는 클라이언트의 파일을 서버로 보내고, 다운로드 요청을 보낼 때는 서버에서 파일을 받아 클라이언트의 로컬에 저장합니다.

예시 코드

서버 구현

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        int port = 1234;

        try {
            ServerSocket serverSocket = new ServerSocket(port);
            System.out.println("서버 시작! 클라이언트를 기다립니다...");

            Socket socket = serverSocket.accept();
            System.out.println("클라이언트가 연결되었습니다.");

            InputStream inputStream = socket.getInputStream();

            // 파일 저장 경로
            String filePath = "C:/file_server/uploads/file.txt";
            FileOutputStream fileOutputStream = new FileOutputStream(filePath);

            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                fileOutputStream.write(buffer, 0, bytesRead);
            }

            fileOutputStream.close();
            socket.close();
            serverSocket.close();

            System.out.println("파일 전송이 완료되었습니다.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

클라이언트 구현

import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class Client {
    public static void main(String[] args) {
        String serverIP = "127.0.0.1";
        int serverPort = 1234;

        String filePath = "C:/client_files/file.txt";

        try {
            Socket socket = new Socket(serverIP, serverPort);
            System.out.println("서버에 연결되었습니다.");

            OutputStream outputStream = socket.getOutputStream();

            FileInputStream fileInputStream = new FileInputStream(filePath);

            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = fileInputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }

            fileInputStream.close();
            outputStream.close();
            socket.close();

            System.out.println("파일 전송이 완료되었습니다.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

위 예시 코드는 파일 전송을 서버와 클라이언트 간에 이루어지도록 구현한 것입니다. 서버는 파일을 받아서 특정 경로에 저장하고, 클라이언트는 파일을 읽어서 서버에 전송합니다.

마무리

이번에는 자바 소켓 프로그래밍을 활용하여 파일 공유 시스템을 구현하는 방법에 대해 알아보았습니다. 소켓을 이용하면 클라이언트와 서버 사이의 통신을 구현할 수 있으며, 파일 전송과 같은 기능도 쉽게 구현할 수 있습니다. 자바 소켓 프로그래밍은 네트워크 개발에 필수적인 기술이므로, 좀 더 공부해보시기를 추천드립니다.