ホームページ  >  記事  >  Java  >  Java と WebSocket の組み合わせ: リアルタイム音声通信を実現する方法

Java と WebSocket の組み合わせ: リアルタイム音声通信を実現する方法

WBOY
WBOYオリジナル
2023-12-18 08:24:471268ブラウズ

Java と WebSocket の組み合わせ: リアルタイム音声通信を実現する方法

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 アプリケーション開発用のクラスとインターフェイスのセットを提供します。

  1. WebSocket サーバー:
    まず、クライアント接続を受信して​​通信を処理するための WebSocket サーバーを作成する必要があります。以下は、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 アノテーションによって定義されます。接続の確立と受信、メッセージ、接続の終了、エラーなどのイベントを処理するために使用されます。

  1. WebSocket クライアント:
    次に、上記のサーバーに接続して音声通信を行うための WebSocket クライアントを作成する必要があります。以下は、単純な WebSocket クライアントのサンプル コードです。
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 サーバーとクライアントを介して、これに基づいてリアルタイム音声通信を実装できます。

  1. リアルタイムオーディオ収集: まず、Java の Audio API を使用してオーディオ データをリアルタイムで収集し、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 クライアント。

  1. リアルタイム オーディオ再生: クライアントがサーバーからオーディオ データを受信した後、Java のオーディオ API を使用してオーディオをリアルタイムで再生できます。具体的なコードは次のとおりです。
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を利用して実装されており、リアルタイムのオーディオ通信を実現しながら、その他にも柔軟な機能拡張スペースを提供します。

参考資料:

  1. Oracle 公式ドキュメント - Java WebSocket API: https://docs.oracle.com/javaee/8/api/javax/websocket/package-summary.html

以上がJava と WebSocket の組み合わせ: リアルタイム音声通信を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。