본문 바로가기
Java/Java

Java 음성 소켓 통신(서버, 클라이언트) 기초

by code2772 2023. 4. 21.

[ 목차 ]

    728x90
    반응형

    ✔ Server

    import java.io.*;
    import java.net.*;
    import javax.sound.sampled.*;
    
    public class Server {
        public static void main(String[] args) throws IOException {
            ServerSocket serverSocket = null;
            try {
                // 서버 소켓 생성
                serverSocket = new ServerSocket(12345);
                System.out.println("서버가 12345번 포트에서 연결 요청을 기다리고 있습니다...");
    
                // 클라이언트 연결 대기
                Socket clientSocket = serverSocket.accept();
                System.out.println("클라이언트가 접속했습니다. IP 주소: " + clientSocket.getInetAddress().getHostName());
    
                // 오디오 입력 스트림 생성 - 오디오 데이터의(샘플 속도, 샘플 크기, 채널 수, 부모 및 엔디안)
                AudioFormat audioFormat = new AudioFormat(8000.0f, 16, 1, true, true);
                // TargetDataLine 열고 시작하여 클라이언트에서 오디에 데이터 녹음을 시작할 수 있다.
                TargetDataLine targetDataLine = AudioSystem.getTargetDataLine(audioFormat);
                targetDataLine.open(audioFormat);
                targetDataLine.start();
    
                // 오디오 출력 스트림 생성   ->  "AudioSystem.NOT_SPECIFIED" = 오디오 데이터의 길이를 미리 알 수 없음을 나타내는 부분이다.
                AudioInputStream audioInputStream = new AudioInputStream(clientSocket.getInputStream(), audioFormat, AudioSystem.NOT_SPECIFIED);
                // SourceDataLine 열고 시작하여 클라이언트로 오디오 데이토를 전송할 수 있다.
                SourceDataLine sourceDataLine = AudioSystem.getSourceDataLine(audioFormat);
                sourceDataLine.open(audioFormat);
                sourceDataLine.start();
    
                // 오디오 스트림 전송
                byte[] buffer = new byte[1000];
                while (true) {
                    int bytesRead = audioInputStream.read(buffer, 0, buffer.length);
                    if (bytesRead == -1) {
                        break;
                    }
                    sourceDataLine.write(buffer, 0, bytesRead);
                    targetDataLine.read(buffer, 0, bytesRead);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (LineUnavailableException e) {
                e.printStackTrace();
            } finally {
                if (serverSocket != null) {
                    serverSocket.close();
                }
            }
        }
    }

    ✔ Client

    import java.io.*;
    import java.net.*;
    import javax.sound.sampled.*;
    
    public class Client {
        public static void main(String[] args) throws IOException {
            String serverHostname = "localhost";
            int port = 12345;
            try {
                // 서버에 연결
                Socket clientSocket = new Socket(serverHostname, port);
                System.out.println("Connected to server " + serverHostname + " on port " + port);
    
                // 오디오 출력 스트림 생성
                AudioFormat audioFormat = new AudioFormat(8000.0f, 16, 1, true, true);
                // SourceDataLine 열고 시작하여 서버에서 받은 오디오 데이터 재생을 시작할 수 있다.
                SourceDataLine sourceDataLine = AudioSystem.getSourceDataLine(audioFormat);
                sourceDataLine.open(audioFormat);
                sourceDataLine.start();
    
                // 오디오 입력 스트림 생성
                AudioInputStream audioInputStream = new AudioInputStream(clientSocket.getInputStream(), audioFormat, AudioSystem.NOT_SPECIFIED);
                // TargetDataLine 열고 시작하여 서버로 보낼 오디오 데이터 녹음을 시작할 수 있다.
                TargetDataLine targetDataLine = AudioSystem.getTargetDataLine(audioFormat);
                targetDataLine.open(audioFormat);
                targetDataLine.start();
    
                // 오디오 스트림 전송
                // 서버로부터 받은 오디오 데이터를 저장하기 위해 1000바이트 버퍼 생성
                byte[] buffer = new byte[1000];
                while (true) {
                    // audioInputStream 에서 읽어 버퍼에 저장되고 최대 수는 버퍼의 크기만큼
                    int bytesRead = audioInputStream.read(buffer, 0, buffer.length);
                    // 입력 스트립에서 읽은 오디오 데이터가 -1이면 오디오 스트림의
                    if (bytesRead == -1) {
                        break;
                    }
                    // 버퍼에 저장된 오디오 데이터는 클라이언트 측에서
                    // 오디오를 재생하는 출력 스트림 sourceDataLine 기록
                    sourceDataLine.write(buffer, 0, bytesRead);
                    // 서버에서 수신한 오디오 데이터는 클라이언트 측에서
                    // 오디오를 캡쳐해 targetDataLine에도 기록
                    targetDataLine.read(buffer, 0, bytesRead);
                }
                // 도중에 발생할 수 있는 예외처리
            } catch (IOException e) {
                e.printStackTrace();
            } catch (LineUnavailableException e) {
                e.printStackTrace();
            }
        }
    }

    ✔ 화면

    반응형

    'Java > Java' 카테고리의 다른 글

    JAVA 채팅 프로그램  (0) 2022.10.20
    JAVA (TCP/IP, 서버 클라이언트)  (0) 2022.10.20
    JAVA 네트워크  (0) 2022.10.20
    자바 제네릭(Generic)  (0) 2022.10.12
    자바 스레드  (0) 2022.10.07