Java と WebSocket の組み合わせ: リアルタイム音声通信を実現する方法
はじめに:
インターネットの発展により、リアルタイム通信が可能になりました。現代のソーシャルアプリケーションの基礎となる要件の1つ。その中でも、リアルタイム音声通信は、重要なリアルタイム通信方式として、音声通話や音声チャットなどのアプリケーションシナリオで重要な役割を果たしています。この記事では、Java と WebSocket を使用してリアルタイム音声通信を実装する方法と、具体的なコード例を紹介します。
1. WebSocket の概要:
WebSocket は、長時間持続する TCP 接続を通じてクライアントとサーバー間のリアルタイムの双方向通信を可能にする全二重通信プロトコルです。 HTTP 要求応答モデルとは異なり、WebSocket プロトコルを使用すると、サーバーがクライアントにメッセージをアクティブに送信でき、リアルタイム通信の目標を達成できます。
2. Java での WebSocket の使用:
Java では、Java WebSocket (Javax WebSocket API) を使用して WebSocket 関数を実装できます。 Java WebSocket API は Java 8 で導入され、WebSocket アプリケーション開発用のクラスとインターフェイスのセットを提供します。
@ServerEndpoint("/audio") public class AudioServer { @OnOpen public void onOpen(Session session) { // 当有新连接建立时的操作 } @OnMessage public void onMessage(byte[] audioData, Session session) { // 处理收到的音频数据 } @OnClose public void onClose(Session session) { // 当连接关闭时的操作 } @OnError public void onError(Session session, Throwable throwable) { // 处理错误 } }
上記のコードは、@ServerEndpoint
アノテーションを使用して、クラス AudioServer
をWebSocket サーバー側、および対応するメソッドは、@OnOpen
、@OnMessage
、@OnClose
、および @OnError
アノテーションによって定義されます。接続の確立と受信、メッセージ、接続の終了、エラーなどのイベントを処理するために使用されます。
public class AudioClient { public static void main(String[] args) throws Exception { WebSocketContainer container = ContainerProvider.getWebSocketContainer(); Session session = container.connectToServer(new Endpoint() { @Override public void onOpen(Session session, EndpointConfig config) { // 连接建立后的操作 } @Override public void onClose(Session session, CloseReason closeReason) { // 连接关闭后的操作 } @Override public void onError(Session session, Throwable throwable) { // 处理错误 } @Override public void onMessage(String text, Session session) { // 处理收到的消息 } }, new URI("ws://localhost:8080/audio")); // 发送音频数据 byte[] audioData = new byte[1024]; session.getBasicRemote().sendBinary(ByteBuffer.wrap(audioData)); // 关闭连接 session.close(); } }
上記のコードでは、WebSocketContainer
クラスと Session
クラスを使用して WebSocket サーバーに接続し、 passEndpoint
クラスの実装は、接続の確立、接続の終了、エラー、メッセージの受信などのイベントを処理します。
3. リアルタイム音声通信の実装:
上で紹介した WebSocket サーバーとクライアントを介して、これに基づいてリアルタイム音声通信を実装できます。
public class AudioCapture { public static void main(String[] args) throws LineUnavailableException { AudioFormat format = new AudioFormat(16000, 16, 1, true, true); DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info); line.open(format); line.start(); // 创建WebSocket客户端并连接服务器 AudioClient client = new AudioClient(); // 循环采集音频数据并发送至服务器 byte[] buffer = new byte[1024]; while (true){ line.read(buffer, 0, buffer.length); client.send(buffer); } } }
上記のコードは Java のオーディオ API を使用し、TargetDataLine
クラスを通じてリアルタイムでオーディオ データを収集し、そのデータをサーバーに送信します。 WebSocket クライアント。
public class AudioPlayer { public static void main(String[] args) throws LineUnavailableException { AudioFormat format = new AudioFormat(16000, 16, 1, true, true); DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info); line.open(format); line.start(); // 创建WebSocket客户端并连接服务器 AudioClient client = new AudioClient(); // 循环接收服务器端发送的音频数据并播放 client.setAudioListener(new AudioListener() { @Override public void onAudioReceived(byte[] audioData) { line.write(audioData, 0, audioData.length); } }); } }
上記のコードは、Java のオーディオ API を使用して、SourceDataLine
クラスを通じてオーディオ データをリアルタイムで再生します。 WebSocketクライアント経由でサーバーから音声データを受信したら、コールバック関数を実行してプレーヤーに音声データを書き込みます。
結論:
Java と WebSocket を組み合わせることで、リアルタイムの音声通信を実現できます。サーバー側では WebSocket サーバーを使用して接続、音声データの受信、送信などの操作を処理し、クライアント側では WebSocket クライアントを使用してサーバーに接続し、音声の収集と再生の操作を実行します。すべての処理はJavaのオーディオAPIとWebSocket APIを利用して実装されており、リアルタイムのオーディオ通信を実現しながら、その他にも柔軟な機能拡張スペースを提供します。
参考資料:
以上がJava と WebSocket の組み合わせ: リアルタイム音声通信を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。