[ 목차 ]
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 |