Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Golang melaksanakan websocket

Golang melaksanakan websocket

王林
王林asal
2023-05-22 14:45:082384semak imbas

Dengan pembangunan berterusan teknologi Internet, sambungan masa nyata telah menjadi fungsi penting untuk lebih banyak aplikasi. WebSocket ialah protokol rangkaian berdasarkan protokol TCP yang membolehkan pelayan menolak data kepada klien untuk mencapai komunikasi dua hala masa nyata.

Go ialah bahasa pengaturcaraan yang pantas dan cekap Disebabkan kesederhanaan dan kecekapannya, ia telah menjadi salah satu bahasa yang paling popular sejak beberapa tahun kebelakangan ini. Dalam artikel ini, kami akan memperkenalkan cara melaksanakan perkhidmatan WebSocket menggunakan bahasa Go.

Apakah itu WebSocket

Protokol WebSocket ialah protokol komunikasi dupleks penuh berdasarkan protokol TCP yang membenarkan komunikasi masa nyata antara klien dan pelayan. Berbanding dengan permintaan HTTP tradisional dan mod tindak balas, WebSocket boleh mengekalkan keadaan sambungan selepas sambungan diwujudkan, dengan itu mencapai komunikasi dua hala masa nyata.

Aliran kerja protokol WebSocket adalah seperti berikut:

  1. Pelanggan memulakan permintaan sambungan WebSocket.
  2. Selepas menerima permintaan, pelayan melakukan protokol jabat tangan untuk mengesahkan bahawa sambungan WebSocket boleh digunakan.
  3. Selepas sambungan WebSocket diwujudkan, pelanggan dan pelayan boleh menjalankan komunikasi dua hala masa nyata.
  4. Jika pelayan perlu menghantar data kepada klien, ia boleh menghantarnya terus kepada klien dan begitu juga sebaliknya.

Berbanding dengan permintaan HTTP tradisional, kelebihan WebSocket ialah:

  1. Komunikasi dua hala masa nyata, sesuai untuk permainan dalam talian, sembang masa nyata, video dalam talian dan aplikasi masa nyata lain Senario aplikasi.
  2. Kurang permintaan dan respons, mengurangkan penggunaan lebar jalur rangkaian dan meningkatkan kecekapan penghantaran data.

Go melaksanakan WebSocket

Go ialah bahasa yang sedang berkembang pesat, disebabkan kesederhanaan, kecekapan, keselamatan dan ciri-ciri lain, semakin ramai pasukan mula menggunakan Go untuk membangunkan aplikasi rangkaian. Dalam Go, terdapat net/http perpustakaan standard yang menyediakan API untuk melaksanakan perkhidmatan HTTP dan WebSocket.

Mewujudkan sambungan WebSocket

Untuk mewujudkan sambungan WebSocket, kami perlu melaksanakan operasi berikut pada pelayan dan klien masing-masing:

Pelayan

  1. Cipta perkhidmatan HTTP, gunakan fungsi http.HandleFunc untuk mendaftarkan penghala dan benarkan fungsi pemprosesan penghalaan yang sepadan untuk melaksanakan komunikasi WebSocket.
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    // 判断是否支持 WebSocket,如果支持则进入 WebSocket 通信处理函数。
    if websocket.IsWebSocketUpgrade(r) {
        websocket.Handler(handleWebSocket).ServeHTTP(w, r)
        return
    }

    http.ServeFile(w, r, "index.html")
})
  1. Lakukan operasi penubuhan sambungan dalam fungsi pemprosesan komunikasi WebSocket.
func handleWebSocket(conn *websocket.Conn) {
    defer conn.Close()

    // 输出日志信息,表示已经建立连接。
    log.Println("WebSocket connected")

    for {
        // 读取客户端发送过来的消息。
        _, msg, err := conn.ReadMessage()
        if err != nil {
            log.Println("Read error:", err)
            return
        }

        // 输出日志信息,表示接收到客户端发送的消息。
        log.Printf("Received: %s
", msg)

        // 处理完毕后,发送消息。
        err = conn.WriteMessage(websocket.TextMessage, msg)
        if err != nil {
            log.Println("Write error:", err)
            return
        }
    }
}

Pelanggan

Dalam klien, kami perlu menggunakan kod JavaScript untuk mengendalikan sambungan WebSocket. Kod khusus adalah seperti berikut:

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

socket.onopen = function() {
  console.log("WebSocket connected");
};

socket.onmessage = function(event) {
  console.log("Received: " + event.data);
};

socket.onclose = function(event) {
  console.log("WebSocket closed");
};

socket.onerror = function(event) {
  console.log("WebSocket error: " + event.data);
};

Hantar mesej

Apabila sambungan WebSocket diwujudkan, pelayan dan pelanggan boleh menjalankan komunikasi dua hala masa nyata. Pelayan boleh menghantar mesej kepada klien melalui fungsi conn.WriteMessage dan klien boleh menghantar mesej kepada pelayan melalui fungsi socket.send.

Hantar mesej daripada pelanggan:

socket.send("Hello world");

Terima dan proses mesej pada pelayan:

_, msg, err := conn.ReadMessage()
if err != nil {
    log.Println("Read error:", err)
    return
}

log.Printf("Received: %s
", msg)

Hantar mesej daripada pelayan:

err = conn.WriteMessage(websocket.TextMessage, []byte("Hello world"))
if err != nil {
    log.Println("Write error:", err)
    return
}

Pada klien Terima dan proses mesej:

socket.onmessage = function(event) {
    console.log("Received: " + event.data);
};

Pengendalian ralat WebSocket

Dalam pembangunan sebenar, WebSocket mungkin menghadapi pelbagai situasi tidak normal, seperti gangguan rangkaian, tamat masa sambungan, ranap pelayan, dsb. Dalam Go, kami boleh mengendalikan pengecualian ini melalui pengendalian ralat.

Di bahagian pelayan, kita boleh menggunakan pernyataan defer untuk mengeluarkan sumber, seperti menutup sambungan WebSocket, dsb.

defer conn.Close()

Pada masa yang sama, semasa proses fungsi pemprosesan komunikasi soket web, kita perlu melakukan praproses ralat yang mungkin berlaku. Contohnya:

_, msg, err := conn.ReadMessage()
if err != nil {
    log.Println("Read error:", err)
    return
}

Dalam klien, kami boleh mengendalikan ralat WebSocket melalui acara onerror, contohnya:

socket.onerror = function(event) {
    console.log("WebSocket error: " + event.data);
};

Ringkasan

Artikel ini memperkenalkan cara menggunakan Bahasa Go Laksanakan perkhidmatan WebSocket, termasuk mewujudkan sambungan WebSocket, menghantar mesej, pengendalian pengecualian, dsb. Protokol WebSocket menyediakan kaedah komunikasi dua hala masa nyata dan boleh digunakan dalam senario aplikasi masa nyata seperti permainan dalam talian, sembang masa nyata dan video dalam talian. Dalam Go, perkhidmatan WebSocket boleh dilaksanakan dengan mudah menggunakan API yang disediakan oleh perpustakaan standard net/http.

Atas ialah kandungan terperinci Golang melaksanakan websocket. 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
Artikel sebelumnya:golang sediakan berbilang terasArtikel seterusnya:golang sediakan berbilang teras