首頁  >  文章  >  後端開發  >  golang 怎麼實作websocket

golang 怎麼實作websocket

PHPz
PHPz原創
2023-03-29 11:26:491878瀏覽

在現代前端越來越注重即時和互動性的時代,一種網路通訊協定變得更加流行,它就是 WebSocket。在使用中,WebSocket 和 HTTP 有一定的相似點,但是與傳統的 HTTP 請求不同,WebSocket 能夠實現長時間保持連線。如果你正在考慮使用 WebSocket 來建立 Web 應用程序,那麼你可能需要使用一些程式語言來實現它。其中,Golang 是一種非常流行的程式語言之一,讓我們來了解如何在 Golang 中實作 WebSocket。

一、什麼是 WebSocket?

WebSocket 是一種在單一 TCP 連線上提供雙向通訊的網路協定。在傳統的 HTTP 協定中,請求從瀏覽器傳送到伺服器,伺服器進行處理後傳回結果給瀏覽器,這個過程是一次性的,請求處理完成之後,連線就會關閉。而 WebSocket 協定則不同,當瀏覽器與伺服器建立連線後,連線就會一直保持,直到使用者或伺服器決定關閉連線。這意味著,在連線保持期間,伺服器可以隨時向客戶端發送訊息,而不需要等待瀏覽器發出請求。

二、Golang 實作 WebSocket

Golang 是一種支援並發程式設計的程式語言,最初由 Google 開發,它的優勢在於它的運作效率和記憶體佔用率極低。下面我們將介紹如何使用 Golang 實作 WebSocket。

  1. 安裝 Gorilla WebSocket 庫
     Gorilla WebSocket 是一個流行的 WebSocket 庫,它提供了簡單易用的 API,用於建立和處理 WebSocket 連線。在安裝Gorilla WebSocket 函式庫之前,你需要先安裝Go 環境,Go 安裝完成後,使用下列指令即可安裝Gorilla WebSocket 函式庫:

    go get github.com/gorilla/websocket
  2. 寫程式碼

下面我們將使用Go 和Gorilla WebSocket 函式庫來實作一個簡單的聊天室。在我們的聊天室中,用戶可以發送訊息並查看來自其他用戶的訊息。以下是實作WebSocket 聊天室的程式碼:

package main

import (
    "fmt"
    "log"
    "net/http"
    "github.com/gorilla/websocket"
)

var clients = make(map[*websocket.Conn]bool)
var broadcast = make(chan Message)
var upgrader = websocket.Upgrader{}

// Message struct
type Message struct {
    Username string `json:"username"`
    Body     string `json:"body"`
}

func main() {
    // Configure websocket route
    http.HandleFunc("/ws", handleConnections)

    // Start listening for incoming chat messages
    go handleMessages()

    // Start the server on localhost port 8080 and log any errors
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

func handleConnections(w http.ResponseWriter, r *http.Request) {
    // Upgrade initial GET request to a websocket
    ws, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Fatal(err)
    }
    // Make sure we close the connection when the function returns
    defer ws.Close()

    // Register our new client
    clients[ws] = true

    for {
        var msg Message
        // Read in a new message as JSON and map it to a Message object
        err := ws.ReadJSON(&msg)
        if err != nil {
            log.Printf("error: %v", err)
            delete(clients, ws)
            break
        }
        // Send the newly received message to the broadcast channel
        broadcast <- msg
    }
}

func handleMessages() {
    for {
        // Grab the next message from the broadcast channel
        msg := <-broadcast
        // Send it out to every client that is currently connected
        for client := range clients {
            err := client.WriteJSON(msg)
            if err != nil {
                log.Printf("error: %v", err)
                client.Close()
                delete(clients, client)
            }
        }
    }
}

程式碼的主要想法是建立一個WebSocket 連線並加入到clients 清單中,任何訊息都會被寫入到broadcast 通道中,並在另一個goroutine 中傳送到所有客戶端。每個連接透過讀取和分配 Message 物件來接收訊息。客戶端發送訊息的範例程式碼如下:

let socket = new WebSocket("ws://localhost:8080/ws");

socket.addEventListener("open", function() {
  socket.send(JSON.stringify({
    "username": "John",
    "body": "Hello World!"
  }));
});

socket.addEventListener("message", function(event) {
  console.log("Received: " + event.data);
});

在這個範例中,我們首先建立一個 WebSocket 物件並將其連接到伺服器。在連線成功後,我們發送一個 JSON 作為訊息體。當服務端傳送訊息給客戶端時,我們需要在客戶端的 JavaScript 程式碼中監聽 message 事件,並在收到訊息時處理它。

三、總結

WebSocket 提供了一種即時通訊的新方式,它為 Web 應用提供了更多互動性和使用者體驗。使用 Golang 和 Gorilla WebSocket 庫可以輕鬆地實現 WebSocket 連接,並在應用程式中使用 WebSocket 協定。

本文提供了一個簡單的聊天室的實作範例,希望對您有所幫助。當然,WebSocket 還可以用於許多其他類型的應用程序,因此請根據您自己的需求進行調整。

以上是golang 怎麼實作websocket的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn