Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Panduan Pengaturcaraan WebSocket Golang: Membina aplikasi masa nyata berprestasi tinggi

Panduan Pengaturcaraan WebSocket Golang: Membina aplikasi masa nyata berprestasi tinggi

王林
王林asal
2023-12-18 09:51:391189semak imbas

golang WebSocket编程指南:构建高性能的实时应用

Panduan Pengaturcaraan WebSocket Golang: Membina aplikasi masa nyata berprestasi tinggi

Pengenalan:
Dengan perkembangan pesat Internet, keperluan untuk komunikasi masa nyata menjadi semakin mendesak. Sebagai protokol komunikasi dua hala, WebSocket boleh mewujudkan sambungan berterusan antara penyemak imbas dan pelayan, menyediakan penyelesaian yang cekap dan boleh dipercayai untuk aplikasi masa nyata. Artikel ini akan memperkenalkan cara menggunakan Golang untuk membina aplikasi masa nyata berprestasi tinggi dan memberikan contoh kod khusus.

1 Apakah itu protokol WebSocket? Protokol WebSocket ialah protokol berasaskan TCP Dengan mewujudkan sambungan dupleks penuh yang berterusan antara penyemak imbas dan pelayan, pelayan boleh menolak data secara aktif untuk mencapai komunikasi masa nyata. . Berbanding dengan protokol HTTP tradisional, protokol WebSocket mempunyai kelebihan berikut:

    Berbanding dengan protokol HTTP, proses jabat tangan protokol WebSocket adalah lebih mudah, mengurangkan kelewatan dalam penubuhan sambungan.
  1. Protokol WebSocket boleh menghantar data dalam kedua-dua arah dalam sambungan, mengurangkan overhed penghantaran data.
  2. Protokol WebSocket menyokong komunikasi merentas domain dan boleh mewujudkan sambungan di bawah nama domain yang berbeza untuk mencapai perkongsian dan pertukaran data.
2. Pengaturcaraan WebSocket di Golang

Golang, sebagai bahasa pengaturcaraan berprestasi tinggi, menyediakan perpustakaan standard yang mudah dan mudah digunakan untuk mengendalikan komunikasi WebSocket. Berikut ialah contoh kod untuk pelayan WebSocket mudah:

package main

import (
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

func main() {
    http.HandleFunc("/echo", echoHandler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

func echoHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Fatal("upgrade error:", err)
    }
    defer conn.Close()

    for {
        messageType, message, err := conn.ReadMessage()
        if err != nil {
            log.Println("read error:", err)
            break
        }
        log.Println("receive:", string(message))

        err = conn.WriteMessage(messageType, message)
        if err != nil {
            log.Println("write error:", err)
            break
        }
    }
}

Dalam kod di atas, permintaan WebSocket dipetakan kepada melalui fungsi <code>http.HandleFunc dan laluan /echo echoHandler fungsi. Dalam fungsi echoHandler, kami menggunakan websocket.Upgrader untuk meningkatkan sambungan HTTP kepada sambungan WebSocket dan mendapatkan contoh websocket.Conn. Pelayan WebSocket Echo yang ringkas dilaksanakan dengan membaca mesej dalam conn dan menulis mesej yang sama.

http.HandleFunc函数和路由/echo将WebSocket请求映射到echoHandler函数。在echoHandler函数中,我们使用websocket.Upgrader来升级HTTP连接为WebSocket连接,并得到一个websocket.Conn实例。通过读取conn中的消息并写入相同的消息,实现了一个简单的WebSocket Echo服务器。

三、实时聊天室示例
以上示例只实现了简单的消息回显功能。下面,我们将展示如何使用Golang构建一个实时聊天室,其中多个用户可以同时进行实时通信。

package main

import (
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

type Message struct {
    Username string `json:"username"`
    Content  string `json:"content"`
}

type Room struct {
    clients  map[*websocket.Conn]bool
    broadcast chan Message
    join     chan *websocket.Conn
    leave    chan *websocket.Conn
}

func (r *Room) start() {
    for {
        select {
        case conn := <-r.join:
            r.clients[conn] = true
        case conn := <-r.leave:
            delete(r.clients, conn)
            close(conn)
        case message := <-r.broadcast:
            for conn := range r.clients {
                err := conn.WriteJSON(message)
                if err != nil {
                    log.Println("write error:", err)
                    delete(r.clients, conn)
                    close(conn)
                }
            }
        }
    }
}

func main() {
    r := Room{
        clients:  make(map[*websocket.Conn]bool),
        broadcast: make(chan Message),
        join:     make(chan *websocket.Conn),
        leave:    make(chan *websocket.Conn),
    }

    go r.start()

    http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
        conn, err := upgrader.Upgrade(w, r, nil)
        if err != nil {
            log.Fatal("upgrade error:", err)
        }

        r.join <- conn

        defer func() {
            r.leave <- conn
        }()

        for {
            var message Message
            err = conn.ReadJSON(&message)
            if err != nil {
                log.Println("read error:", err)
                break
            }

            r.broadcast <- message
        }
    })

    log.Fatal(http.ListenAndServe(":8080", nil))
}

在上述代码中,我们定义了一个Room类型来管理连接的客户端。Room类型内部包含了clients用来保存所有已连接的客户端,broadcast用来广播消息,joinleave用来处理客户端的连接和断开。

main函数中,我们创建了一个Room实例,并通过go r.start()启动Room实例的消息处理协程。通过http.HandleFunc函数和路由/ws将WebSocket请求映射到匿名函数。在匿名函数中,我们将连接加入到Roomjoin通道中,并在函数末尾将连接从Roomleave通道中移除。同时,我们使用conn.ReadJSONconn.WriteJSON3. Contoh bilik sembang masa nyata

Contoh di atas hanya melaksanakan fungsi gema mesej ringkas. Di bawah, kami akan menunjukkan cara menggunakan Golang untuk membina ruang sembang masa nyata di mana berbilang pengguna boleh berkomunikasi dalam masa nyata pada masa yang sama.

rrreee
Dalam kod di atas, kami mentakrifkan jenis Bilik untuk mengurus pelanggan yang disambungkan. Jenis Bilik secara dalaman mengandungi klien untuk menyimpan semua klien yang disambungkan, siaran untuk menyiarkan mesej dan menyertai dan leave digunakan untuk mengendalikan sambungan dan pemutusan sambungan klien.

🎜Dalam fungsi utama, kami mencipta contoh Bilik dan memulakan Bilik melalui go r.start() kod>Coroutine pemprosesan mesej bagi contoh. Peta WebSocket meminta fungsi tanpa nama melalui fungsi <code>http.HandleFunc dan laluan /ws. Dalam fungsi tanpa nama, kami menyertai sambungan ke saluran sertai Room dan pada penghujung fungsi kami meninggalkan sambungan dari Room keluar Dialih keluar daripada saluran. Pada masa yang sama, kami menggunakan conn.ReadJSON dan conn.WriteJSON untuk membaca dan menulis mesej masing-masing dalam format JSON. 🎜🎜Kesimpulan:🎜Artikel ini memberi panduan untuk membina aplikasi masa nyata berprestasi tinggi dengan memperkenalkan ciri-ciri protokol WebSocket dan cara menggunakannya di Golang. Dengan menyediakan contoh kod khusus, pembaca boleh dengan cepat memulakan pengaturcaraan Golang WebSocket dan menggunakan fungsi komunikasi masa nyata dalam projek. Harap artikel ini membantu anda! 🎜

Atas ialah kandungan terperinci Panduan Pengaturcaraan WebSocket Golang: Membina aplikasi masa nyata berprestasi tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn