Rumah > pembangunan bahagian belakang > Golang > Tutorial golang Websocket: bagaimana untuk membangunkan fungsi penyerahan dalam talian

Tutorial golang Websocket: bagaimana untuk membangunkan fungsi penyerahan dalam talian

王林
Lepaskan: 2023-12-17 10:23:21
asal
1110 orang telah melayarinya

golang Websocket教程:如何开发在线投稿功能

Tutorial Soket Web Golang: Cara membangunkan fungsi penghantaran dalam talian

Pengenalan:
Dengan perkembangan pesat Internet, semakin banyak aplikasi perlu melaksanakan fungsi komunikasi masa nyata. Dalam aplikasi rangkaian, teknologi Websocket telah menjadi protokol komunikasi yang biasa digunakan. Artikel ini bertujuan untuk mengajar pembaca cara menggunakan bahasa Golang untuk membangunkan fungsi penyerahan dalam talian dan menggunakan Websocket untuk mencapai interaksi masa nyata.

1. Pengenalan kepada Websocket
Websocket ialah protokol komunikasi dupleks penuh yang boleh mewujudkan sambungan berterusan antara penyemak imbas dan pelayan untuk mencapai komunikasi masa nyata. Berbanding dengan protokol HTTP tradisional, Websocket mempunyai kependaman yang lebih rendah dan daya pemprosesan yang lebih tinggi, dan sesuai untuk senario aplikasi yang memproses data masa nyata.

2. Persediaan persekitaran pembangunan
Sebelum memulakan pembangunan, anda perlu menyediakan persekitaran pembangunan Golang.

  1. Pasang Golang: Lawati tapak web rasmi https://golang.org/doc/install untuk memuat turun dan memasang versi Golang yang sesuai untuk sistem pengendalian anda.
  2. Pasang perpustakaan berkaitan:

    go get github.com/gorilla/websocket
    Salin selepas log masuk

3. Reka bentuk struktur projek
Sebelum membangunkan fungsi penyerahan dalam talian, anda perlu merancang struktur direktori projek.

- main.go
- handler.go
- template
  - index.html
Salin selepas log masuk

4. Pelaksanaan kod

  1. main.go

    package main
    
    import (
        "html/template"
        "log"
        "net/http"
    
        "github.com/gorilla/websocket"
    )
    
    var (
        upgrader = websocket.Upgrader{}
        clients  = make(map[*websocket.Conn]bool)
        broadcast = make(chan []byte)
        homeTemplate *template.Template
    )
    
    func homeHandler(w http.ResponseWriter, r *http.Request) {
        homeTemplate.Execute(w, nil)
    }
    
    func websocketHandler(w http.ResponseWriter, r *http.Request) {
        conn, err := upgrader.Upgrade(w, r, nil)
        if err != nil {
            log.Println(err)
            return
        }
        defer conn.Close()
    
        clients[conn] = true
    
        for {
            _, msg, err := conn.ReadMessage()
            if err != nil {
                log.Println(err)
                delete(clients, conn)
                return
            }
            broadcast <- msg
        }
    }
    
    func handleMessages() {
        for {
            msg := <-broadcast
            for client := range clients {
                err := client.WriteMessage(websocket.TextMessage, msg)
                if err != nil {
                    log.Println(err)
                    client.Close()
                    delete(clients, client)
                }
            }
        }
    }
    
    func main() {
        // 配置文件路径
        homeTemplate = template.Must(template.ParseFiles("template/index.html"))
    
        http.HandleFunc("/", homeHandler)
        http.HandleFunc("/ws", websocketHandler)
    
        go handleMessages()
    
        err := http.ListenAndServe(":8080", nil)
        if err != nil {
            log.Fatal(err)
        }
    }
    Salin selepas log masuk
  2. pengendali.go

    package main
    
    import (
        "net/http"
        "path/filepath"
    )
    
    func homeHandler(w http.ResponseWriter, r *http.Request) {
        filePath, _ := filepath.Abs("template/index.html")
        http.ServeFile(w, r, filePath)
    }
    Salin selepas log masuk
  3. template/index.html

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>在线投稿功能</title>
    </head>
    <body>
        <h1>在线投稿功能</h1>
        <textarea id="message-input" rows="5" cols="30"></textarea>
        <button id="send-btn">发送</button>
        <br>
        <ul id="message-list"></ul>
    </body>
    <script>
        var socket = new WebSocket("ws://localhost:8080/ws");
        socket.onmessage = function (event) {
            var messageList = document.getElementById("message-list");
            var messageItem = document.createElement("li");
            messageItem.innerText = event.data;
            messageList.appendChild(messageItem);
        };
    
        document.getElementById("send-btn").addEventListener("click", function () {
            var messageInput = document.getElementById("message-input");
            var message = messageInput.value;
            socket.send(message);
        });
    </script>
    </html>
    Salin selepas log masuk
  4. Masukkan dalam arahan baris Dalam direktori projek, laksanakan arahan berikut untuk memulakan pelayan:
go run main.go
Salin selepas log masuk

Buka pelayar dan masukkan alamat http://localhost:8080/ untuk mengakses halaman.
  1. 6. Rumusan

    Melalui langkah di atas, kami telah menyelesaikan pembangunan fungsi penyerahan dalam talian berdasarkan Golang. Penghantaran mesej masa nyata direalisasikan melalui Websocket Selepas pengguna memasukkan mesej dalam kotak teks dan mengklik butang hantar, mesej itu boleh dihantar ke pelayan dan dipaparkan pada halaman serta-merta.
  2. Terus belajar dan mengamalkan teknologi berkaitan Websocket akan membawa lebih banyak kemungkinan dan inovasi kepada pembangunan. Saya harap pembaca boleh menggunakan panduan artikel ini untuk menggunakan Golang dengan lebih baik untuk membangunkan lebih banyak aplikasi rangkaian masa nyata dan interaktif.

Atas ialah kandungan terperinci Tutorial golang Websocket: bagaimana untuk membangunkan fungsi penyerahan dalam talian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan