Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan WebSocket untuk komunikasi merentas platform dalam golang

Cara menggunakan WebSocket untuk komunikasi merentas platform dalam golang

WBOY
WBOYasal
2023-12-18 12:09:19639semak imbas

Cara menggunakan WebSocket untuk komunikasi merentas platform dalam golang

WebSocket ialah teknologi yang digunakan untuk komunikasi dua hala masa nyata antara pelayar web dan pelayan. Ia menyediakan cara yang boleh dipercayai untuk menghantar dan menerima data dan lebih cekap dan lebih pantas daripada mekanisme respons permintaan HTTP tradisional. Dalam golang, kami boleh menggunakan perpustakaan pihak ketiga untuk menyokong komunikasi WebSocket Artikel ini akan memperkenalkan cara menggunakan perpustakaan gorila/soket web untuk melaksanakan komunikasi WebSocket dan menyediakan contoh kod khusus.

  1. Pasang perpustakaan gorila/soket web

Gunakan arahan go get untuk memasang perpustakaan gorila/soket web dengan mudah:

go get github.com/gorilla/websocket
  1. Buat sambungan WebSocket

Di bahagian pelayan pustaka gorilla/soket web, gunakan pustaka Upgrader/websocket Naik taraf kepada sambungan WebSocket. Kodnya adalah seperti berikut:

import (
    "net/http"

    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

func myHandler(w http.ResponseWriter, r *http.Request) {
    // 将HTTP连接升级为WebSocket连接
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        // 处理错误
        return
    }

    // 处理WebSocket连接
    for {
        // 读取消息
        messageType, p, err := conn.ReadMessage()
        if err != nil {
            // 处理错误
            return
        }

        // 处理消息
        err = conn.WriteMessage(messageType, p)
        if err != nil {
            // 处理错误
            return
        }
    }
}

func main() {
    http.HandleFunc("/", myHandler)
    http.ListenAndServe(":8080", nil)
}

Di sisi pelanggan, kami boleh menggunakan kod JavaScript untuk membuat sambungan WebSocket. Kodnya adalah seperti berikut:

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

ws.onopen = function() {
    console.log("WebSocket连接已打开");
};

ws.onmessage = function(evt) {
    console.log("接收到消息: " + evt.data);
};

ws.onclose = function() {
    console.log("WebSocket连接已关闭");
};
  1. Menghantar dan menerima mesej

Di bahagian pelayan, kita boleh menggunakan fungsi WriteMessage untuk menghantar mesej kepada pelanggan. Kodnya adalah seperti berikut:

err := conn.WriteMessage(websocket.TextMessage, []byte("Hello, client!"))
if err != nil {
    // 处理错误
    return
}

Di sisi pelanggan, kita boleh menggunakan fungsi hantar untuk menghantar mesej dan fungsi onmessage untuk menerima mesej. Kodnya adalah seperti berikut:

ws.send("Hello, server!");

ws.onmessage = function(evt) {
    console.log("接收到消息: " + evt.data);
};
  1. Mengendalikan permintaan WebSocket

Dalam aplikasi sebenar, kami mungkin perlu melakukan pengesahan dan kebenaran semasa memproses permintaan WebSocket. Dalam kes ini, kami boleh menggunakan pengepala HTTP untuk menghantar maklumat pengesahan. Sebagai contoh, anda boleh menambah maklumat yang serupa dengan yang berikut dalam pengepala HTTP:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Kemudian, pada bahagian pelayan, kita boleh menggunakan pilihan CheckOrigin bagi fungsi Penaik taraf untuk menyemak asal permintaan WebSocket, dan menggunakan maklumat pengesahan dalam pengepala HTTP untuk memproses permintaan . Kod khusus adalah seperti berikut:

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin: func(r *http.Request) bool {
        // 检查请求的来源
        if r.Header.Get("Origin") != "http://localhost:8080" {
            return false
        }

        // 检查认证信息
        if r.Header.Get("Authorization") != "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" {
            return false
        }

        return true
    },
}

func myHandler(w http.ResponseWriter, r *http.Request) {
    // 将HTTP连接升级为WebSocket连接
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        // 处理错误
        return
    }

    // 处理WebSocket连接
    for {
        // 读取消息
        messageType, p, err := conn.ReadMessage()
        if err != nil {
            // 处理错误
            return
        }

        // 处理消息
        err = conn.WriteMessage(messageType, p)
        if err != nil {
            // 处理错误
            return
        }
    }
}
  1. Ringkasan

Artikel ini memperkenalkan cara menggunakan perpustakaan gorila/soket web dalam golang untuk melaksanakan komunikasi WebSocket dan menyediakan contoh kod khusus. Dengan teknologi WebSocket, kami boleh membina aplikasi komunikasi dua hala masa nyata yang cekap, seperti bilik sembang dalam talian dan permainan berbilang pemain. Dalam aplikasi praktikal, kami juga perlu mempertimbangkan isu seperti keselamatan dan kebolehpercayaan, seperti pengesahan dan kebenaran, pengecualian pengendalian, dsb.

Atas ialah kandungan terperinci Cara menggunakan WebSocket untuk komunikasi merentas platform dalam golang. 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