>  기사  >  백엔드 개발  >  golang Websocket 튜토리얼: 온라인 음악 재생 기능을 개발하는 방법

golang Websocket 튜토리얼: 온라인 음악 재생 기능을 개발하는 방법

WBOY
WBOY원래의
2023-12-17 09:04:521052검색

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

오늘날의 인터넷 시대에 웹 애플리케이션에는 실시간 상호 작용 기능이 점점 더 요구되고 있으며 Websocket은 이러한 상호 작용 방법 중 하나입니다. 효율적인 프로그래밍 언어인 Golang은 기본 Websocket 지원 라이브러리를 제공하여 실시간 대화형 애플리케이션을 보다 쉽고 효율적으로 개발할 수 있도록 해줍니다. 이 기사에서는 Golang을 사용하여 온라인 음악 재생 애플리케이션을 개발하는 방법을 소개합니다. 이 애플리케이션은 Websocket의 실시간 데이터 전송 기능을 최대한 활용하고 여러 사용자가 동시에 동일한 음악을 재생할 수 있도록 합니다. 우리 같이 배워요!

1. 웹소켓이란?

Websocket은 HTML5의 일부이며 웹 애플리케이션의 실시간 양방향 통신을 위한 프로토콜입니다. 전통적인 HTTP 요청-응답 모델과 비교하여 Websocket은 클라이언트와 서버 사이에 지속적인 연결을 설정할 수 있습니다. 연결 프로세스 동안 클라이언트와 서버는 서로 자유롭게 메시지를 보낼 수 있습니다. Websocket의 일반적인 애플리케이션 시나리오에는 온라인 채팅, 실시간 협업, 멀티 플레이어 게임, 온라인 음악 재생 및 실시간 상호 작용이 필요한 기타 애플리케이션 시나리오가 포함됩니다.

2. Golang의 Websocket 라이브러리

Golang에서는 기본 Websocket 라이브러리를 사용하여 Websocket 애플리케이션을 개발할 수 있습니다. 이 라이브러리는 "net/http" 패키지 하위에 위치하며 Websocket 클라이언트와 서버가 동작할 수 있는 WebSocket 구조 형태를 제공합니다. 이 라이브러리는 또한 HTTP 연결을 Websocket 연결로 업그레이드하고, Websocket 클라이언트에서 보낸 메시지를 읽고, Websocket 클라이언트에 메시지를 보내는 데 사용되는 세 가지 기능을 제공합니다.

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. Play music

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. 요약

이 기사에서는 Golang을 사용하여 온라인 음악 재생 애플리케이션을 개발하는 방법을 소개합니다. 이 애플리케이션에서는 여러 사람이 동시에 동일한 음악을 재생할 수 있는 Websocket의 실시간 데이터 전송 기능을 최대한 활용합니다. 실시간 양방향 통신 프로토콜인 Websocket은 실시간 대화형 애플리케이션에서 중요한 역할을 합니다. 뿐만 아니라 효율적인 프로그래밍 언어인 Golang은 Websocket 애플리케이션 개발에 많은 편의성을 제공합니다. 이 기사를 읽은 후에는 Golang을 사용하여 Websocket 애플리케이션을 개발하는 방법에 대한 기본 기술을 마스터했다고 믿습니다.

위 내용은 golang Websocket 튜토리얼: 온라인 음악 재생 기능을 개발하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.