ホームページ  >  記事  >  バックエンド開発  >  golang Websocket チュートリアル: オンライン音楽再生機能の開発方法

golang Websocket チュートリアル: オンライン音楽再生機能の開発方法

WBOY
WBOYオリジナル
2023-12-17 09:04:521112ブラウズ

golang Websocket教程:如何开发在线音乐播放功能

今日のインターネット時代では、Web アプリケーションはリアルタイムのインタラクティブ機能をますます必要とし、Websocket はこのインタラクティブな方法の 1 つです。 Golang は効率的なプログラミング言語として、ネイティブ Websocket サポート ライブラリを提供し、リアルタイムの対話型アプリケーションの開発をより簡単かつ効率的にします。今回は、Websocketのリアルタイムデータ送信機能を駆使し、複数のユーザーが同時に同じ音楽を再生できるオンライン音楽再生アプリケーションをGolangを使って開発する方法を紹介します。私たちは一緒に学びます!

1. Websocket とは何ですか?

Websocket は HTML5 の一部であり、Web アプリケーションにおけるリアルタイムの双方向通信のためのプロトコルです。従来の HTTP リクエスト/レスポンス モデルと比較して、Websocket はクライアントとサーバーの間に永続的な接続を確立でき、接続プロセス中にクライアントとサーバーは相互にメッセージを自由に送信できます。 Websocket の一般的なアプリケーション シナリオには、オンライン チャット、リアルタイム コラボレーション、マルチプレイヤー ゲーム、オンライン音楽再生、およびリアルタイムの対話を必要とするその他のアプリケーション シナリオが含まれます。

2. Golang の Websocket ライブラリ

Golang では、ネイティブ Websocket ライブラリを使用して Websocket アプリケーションを開発できます。このライブラリは「net/http」パッケージの下にあり、WebSocket クライアントとサーバーを操作できる WebSocket 構造タイプを提供します。このライブラリは、HTTP 接続を Websocket 接続にアップグレードし、Websocket クライアントから送信されたメッセージを読み取り、Websocket クライアントにメッセージを送信するために使用される 3 つの関数も提供します。

3. オンライン音楽再生機能の開発

現在、オンライン音楽再生アプリケーションの開発を開始しています。このアプリケーションでは、Websocket を使用して、複数の人が同時に同じ音楽を再生できるようにします。具体的な実装手順は次のとおりです。

  1. 音楽ファイルの準備

音楽ソース ファイルとして使用される MP3 形式の音楽ファイルを準備する必要があります。当社のアプリケーション。オンラインで検索して、気に入った音楽をダウンロードして、ローカルにコピーできます。このファイルをサーバーにアップロードした後、Golang コードで読み取って操作できるように、Golang の「gonum.org/v1/plot/vg/draw」ライブラリを使用してファイルを処理する必要もあります。

  1. サーバー上で Websocket サービスを開始します

まず、「net/http」パッケージと「golang.org/x/net/websocket」をインポートする必要があります。 " パッケージ。次に、http パッケージの http.ListenAndServe() 関数を使用して Websocket サービスを開始できます。

package main

import (
    "net/http"
    "golang.org/x/net/websocket"
)

func main() {
    // 在路径"/play"上开启Websocket服务
    http.Handle("/play", websocket.Handler(playHandler))
    http.ListenAndServe(":8080", nil)
}
  1. Websocket クライアントの接続リクエストの処理

ステップ 2 では、パス「/play」で Websocket サービスを開きました。 Websocket クライアントがこのパスを要求した場合、その要求を処理する必要があります。このリクエストに対して処理関数 playHandler() を設定できます。

func playHandler(ws *websocket.Conn) {
    // 读取客户端发送的音乐播放请求
    playReq := make([]byte, 512)
    n, err := ws.Read(playReq)
    if err != nil {
        return
    }
    playReq = playReq[:n]
    playMusic(playReq, ws)
}

この関数では、websocket.Conn タイプの ws パラメータを使用して、Websocket クライアント上で読み取りおよび書き込み操作を実行します。まず、クライアントから送信された音楽再生リクエストを読み取る必要があります。このリクエストはバイト配列になります。次に、playMusic() 関数を呼び出してこのリクエストを処理し、音楽を再生します。

  1. 音楽を再生する

playMusic() 関数では、Golang の「gonum.org/v1/plot/vg/draw」ライブラリを使用して読み取りと実行を行います。音楽ファイルを処理しています。このライブラリは、音楽ファイルを Golang スライスにカプセル化する機能を提供し、音楽をより便利に操作できるようにします。

func playMusic(playReq []byte, ws *websocket.Conn) {
    // 解析请求,获取要播放的音乐文件名
    filename := string(playReq)
    filename = filename[:strings.Index(filename, "
")]

    // 使用Golang处理获取音乐文件
    musicFile, err := ioutil.ReadFile(filename)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Error: %v
", err)
        return
    }
    musicData, err := mp3.Decode(audioContext, bytes.NewReader(musicFile), len(musicFile))
    if err != nil {
        fmt.Fprintf(os.Stderr, "Error: %v
", err)
        return
    }
    
    // 将播放任务交给一个协程处理
    go func() {
        for {
            // 读取客户端发送的播放位置控制数据
            pos := make([]byte, 8)
            n, err := ws.Read(pos)
            if err != nil {
                // 断开与客户端的连接
                ws.Close()
                break
            }
            pos = pos[:n]

            // 把客户端发送的控制数据转换成时间(秒)
            t := float64(binary.LittleEndian.Uint64(pos)) / float64(SampleRate) + 1.0

            // 每秒播放一次音乐
            time.Sleep(time.Second)

            // 从指定位置开始播放音乐
            musicData.Seek(time.Duration(t)*time.Second, 0)
            buf := make([]byte, 1024)
            // 把音乐数据分帧发送给客户端
            for musicData.Err() == nil {
                n, err := musicData.Read(buf)
                if err != nil {
                    break
                }
                ws.Write(buf[:n])
            }
            // 音乐播放完成后,关闭连接
            ws.Close()
            break
        }
    }()
}

この関数では、まず Websocket クライアントから送信された音楽ファイル名を解析します。次に、ioutil.ReadFile() 関数を使用してファイルを読み取り、mp3.Decode() 関数を使用してファイルを音楽データにデコードします。音楽データがデコードされたら、音楽再生タスクをコルーチンに渡します。このコルーチンでは、Websocket クライアントから送信された制御データを継続的に読み取り、これらのデータに基づいて音楽の再生位置を制御します。音楽データが読み取られた後、それを 1024 バイトのフレームに断片化して、Websocket クライアントに送信します。音楽の再生が完了したら、Websocket クライアントへの接続を閉じます。

  1. Websocket クライアントを使用して音楽を再生する

サーバー側の音楽再生機能が完了したので、次に、使用するためにクライアント上で Websocket コードを記述する必要があります。この機能。 Websocket クライアントは音楽ファイル名と再生位置制御データをサーバーに送信し、音楽の再生位置を制御します。

func main() {
    // 使用Golang内置的WebSocket库连接服务器
    ws, err := websocket.Dial("ws://127.0.0.1:8080/play", "", "http://127.0.0.1:8080")
    if err != nil {
        log.Fatal(err)
    }
    defer ws.Close()

    // 发送播放请求
    filename := "music.mp3
"
    pos := make([]byte, 8)

    for {
        // 持续发送控制数据
        binary.LittleEndian.PutUint64(pos, uint64(time.Now().UnixNano()))
        ws.Write(pos)

        // 一秒钟发送一次控制数据
        time.Sleep(time.Second)
    }
}

このコードでは、最初に websocket.Dial() 関数を使用してサーバーに接続します。そして、音楽ファイル名と再生位置制御データをサーバーに送信します。このコードでは、無限ループを使用して制御データを継続的に送信します。音楽の再生場所を制御するために、制御データが毎秒送信されます。このループは、手動で停止するまで継続する可能性があります。

4.概要

この記事では、Websocket のリアルタイムデータ送信機能を最大限に活用し、複数人での同時演奏をサポートする、Golang を使用したオンライン音楽再生アプリケーションの開発方法を紹介します。 Websocket は、リアルタイムの双方向通信プロトコルとして、リアルタイムの対話型アプリケーションで重要な役割を果たします。それだけでなく、Golang は効率的なプログラミング言語として、Websocket アプリケーションの開発に多くの利便性を提供します。この記事を読んだあなたは、Golang を使用して Websocket アプリケーションを開発する方法の基本的なスキルを習得したと思います。

以上がgolang Websocket チュートリアル: オンライン音楽再生機能の開発方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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