오늘날의 인터넷 시대에 웹 애플리케이션에는 실시간 상호 작용 기능이 점점 더 요구되고 있으며 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을 사용하여 여러 사람이 동시에 동일한 음악을 재생할 수 있습니다. 구체적인 구현 단계는 다음과 같습니다.
애플리케이션에서 음원 파일로 사용할 MP3 형식의 음악 파일을 준비해야 합니다. 온라인으로 검색하고 좋아하는 음악을 다운로드한 다음 로컬로 복사할 수 있습니다. 이 파일이 서버에 업로드된 후 Golang 코드에서 읽고 조작할 수 있도록 Golang의 "gonum.org/v1/plot/vg/draw" 라이브러리를 사용하여 처리해야 합니다.
먼저 "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) }
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() 함수를 호출하여 이 요청을 처리하고 음악을 재생합니다.
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 클라이언트에 대한 연결을 닫습니다.
이제 서버 측에서 음악 재생 기능을 완료했으므로 다음으로 이 기능을 사용하기 위해 클라이언트에 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!