[java] 자바 소켓 프로그래밍을 활용한 실시간 동영상 스트리밍

이번 포스트에서는 자바 소켓 프로그래밍을 활용하여 실시간 동영상 스트리밍을 구현하는 방법에 대해 알아보겠습니다.

스트리밍은 네트워크를 통해 동영상 파일을 실시간으로 전송하고 재생하는 기술을 말합니다. 소켓 프로그래밍은 네트워크 통신을 위한 API를 제공하여 데이터의 송수신을 가능하게 해줍니다. 이를 활용하여 동영상 파일을 전송하고 재생하는 실시간 스트리밍 서비스를 구현할 수 있습니다.

1. 서버 구현

먼저, 서버를 구현해보겠습니다. 서버는 클라이언트의 요청을 받아 동영상 파일을 스트리밍해주는 역할을 담당합니다.

import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

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

        try {
            // 서버 소켓 생성
            ServerSocket serverSocket = new ServerSocket(port);

            System.out.println("서버가 시작되었습니다. 포트: " + port);

            while (true) {
                // 클라이언트의 연결 요청 대기
                Socket clientSocket = serverSocket.accept();

                // 클라이언트에게 동영상 파일 전송
                sendVideo(clientSocket);

                clientSocket.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void sendVideo(Socket clientSocket) {
        try {
            // 동영상 파일 읽기
            FileInputStream fileInputStream = new FileInputStream("video.mp4");

            // 클라이언트와의 데이터 전송을 위한 스트림 생성
            DataOutputStream dataOutputStream = new DataOutputStream(clientSocket.getOutputStream());

            // 동영상 파일을 읽어서 클라이언트에게 전송
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = fileInputStream.read(buffer)) != -1) {
                dataOutputStream.write(buffer, 0, bytesRead);
                dataOutputStream.flush();
            }

            fileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

위의 코드는 서버를 구현한 코드입니다. ServerSocket을 사용하여 클라이언트의 연결 요청을 대기하고, 클라이언트에게 동영상 파일을 전송하는 sendVideo 메소드를 구현하였습니다. 동영상 파일은 FileInputStream을 이용하여 읽은 후, DataOutputStream를 사용하여 클라이언트에게 전송합니다.

2. 클라이언트 구현

클라이언트는 서버로부터 동영상 데이터를 받아 재생하는 역할을 담당합니다. 여기서는 간단히 동영상 데이터를 파일로 저장하는 예제를 구현해보겠습니다.

import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.Socket;

public class VideoStreamingClient {
    public static void main(String[] args) {
        String serverIp = "127.0.0.1";
        int serverPort = 8080;

        try {
            // 서버에 연결
            Socket socket = new Socket(serverIp, serverPort);

            // 서버로부터 동영상 데이터 수신
            receiveVideo(socket);

            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void receiveVideo(Socket socket) {
        try {
            // 서버로부터 데이터 수신을 위한 스트림 생성
            DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());

            // 동영상 데이터를 파일로 저장
            FileOutputStream fileOutputStream = new FileOutputStream("received_video.mp4");

            // 서버로부터 데이터를 수신하여 파일에 저장
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = dataInputStream.read(buffer)) != -1) {
                fileOutputStream.write(buffer, 0, bytesRead);
                fileOutputStream.flush();
            }

            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

위의 코드는 클라이언트를 구현한 코드입니다. Socket을 사용하여 서버에 연결하고, 서버로부터 동영상 데이터를 수신하여 파일로 저장하는 receiveVideo 메소드를 구현하였습니다.

마무리

이번 포스트에서는 자바 소켓 프로그래밍을 활용하여 실시간 동영상 스트리밍 구현하는 방법에 대해 알아보았습니다. 서버에서는 클라이언트로 동영상 파일을 전송하고, 클라이언트에서는 서버로부터 동영상 데이터를 수신하여 재생하거나 파일로 저장할 수 있습니다. 실제로는 더 복잡한 프로토콜과 압축 알고리즘을 적용하여 효율적인 스트리밍 서비스를 구현할 수 있지만, 이 예제는 기본적인 개념을 이해하는 데 도움이 될 것입니다.

참고자료: