0Pricing
Go Academy · Leçon

Utiliser gorilla/websocket

Mettre à niveau et gérer les connexions

Utiliser gorilla/websocket est une leçon Go Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Go Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Go Academy comprend 4 leçons au total.

La bibliothèque gorilla/websocket

gorilla/websocket est la bibliothèque WebSocket Go la plus utilisée. Elle gère la négociation de mise à niveau et vous fournit un objet de connexion permettant de lire et d'écrire des trames. Installez-la avec go get github.com/gorilla/websocket.

import "github.com/gorilla/websocket"

L'Upgrader

Un Upgrader transforme une requête HTTP en connexion WebSocket. Vous configurez les tailles des tampons et une vérification de l'origine.

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

CheckOrigin et sécurité

Par défaut, l'Upgrader rejette les requêtes provenant d'une autre origine. Pendant le développement, vous pouvez assouplir cette règle, mais en production, validez l'en-tête Origin afin d'empêcher le détournement de WebSocket entre sites.

upgrader.CheckOrigin = func(r *http.Request) bool {
    return r.Header.Get("Origin") == "https://myapp.com"
}

Mise à niveau dans un gestionnaire

Dans un http.HandlerFunc, appelez Upgrade. En cas de succès, vous obtenez un *websocket.Conn.

func wsHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        return
    }
    defer conn.Close()
    // read/write loop here
}

Lecture des messages

ReadMessage se bloque jusqu'à l'arrivée d'une trame, puis renvoie le type de message et les octets utiles.

mt, data, err := conn.ReadMessage()
if err != nil {
    return // client closed or error
}
fmt.Printf("got %d bytes\n", len(data))
_ = mt

Écriture des messages

WriteMessage envoie une trame d'un type donné :

err := conn.WriteMessage(websocket.TextMessage, []byte("hello"))
if err != nil {
    return
}

La boucle d'écho

Un exemple classique lit un message et le renvoie. La boucle se termine lorsque la lecture renvoie une erreur, ce qui signifie que le client s'est déconnecté.

for {
    mt, msg, err := conn.ReadMessage()
    if err != nil {
        break
    }
    conn.WriteMessage(mt, msg)
}

Assistants JSON

gorilla fournit ReadJSON et WriteJSON pour sérialiser directement des valeurs Go sur le socket, ce qui est pratique pour les messages structurés. Dans le code source réel, le champ de la structure Msg porte la balise json:"text".

type Msg struct {
    Text string // tag: json text
}
var m Msg
conn.ReadJSON(&m)
conn.WriteJSON(Msg{Text: "ack"})

Règle : un lecteur et un écrivain

Important : une même connexion n'autorise qu'un seul lecteur concurrent et un seul écrivain concurrent. Si plusieurs gouroutines écrivent, protégez les écritures avec un verrou ou faites-les passer par une seule gouroutine, comme nous le verrons dans la diffusion.

Enregistrement de l'itinéraire

Branchez le gestionnaire comme n'importe quel itinéraire HTTP. Les clients se connectent à ws://host/ws.

http.HandleFunc("/ws", wsHandler)
http.ListenAndServe(":8080", nil)

Exécutable : analogie avec un aller-retour JSON

Le code WebSocket nécessite la bibliothèque externe ; cet extrait utilisant la bibliothèque standard reproduit le fonctionnement de ReadJSON/WriteJSON en désérialisant un message entrant dans une map, puis en sérialisant une réponse.

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    in := []byte("{\"text\":\"ping\"}")
    var m map[string]string
    json.Unmarshal(in, &m)
    reply, _ := json.Marshal(map[string]string{"text": m["text"] + "-ack"})
    fmt.Println(string(reply))
}

Vérification rapide

Vérifiez votre compréhension de l'utilisation de gorilla/websocket.

Récapitulatif

Vous avez appris à utiliser gorilla/websocket :

  • Un Upgrader effectue la négociation ; validez CheckOrigin
  • Upgrade fournit un *websocket.Conn
  • Utilisez ReadMessage/WriteMessage ou les assistants JSON
  • Une seule lecture et une seule écriture à la fois par connexion

Questions Fréquemment Posées

La leçon « Utiliser gorilla/websocket » est-elle gratuite ?

Oui — le texte complet de « Utiliser gorilla/websocket » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Go Academy, passe à CoddyKit PRO. Le cours Go Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Utiliser gorilla/websocket » ?

Mettre à niveau et gérer les connexions Tu pratiques Go Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Go Academy ?

Aucune expérience préalable n'est requise. Go Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Utiliser gorilla/websocket » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Go Academy ?

Oui. Chaque leçon Go Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Les bases de WebSocket
  2. Utiliser gorilla/websocket
  3. Diffuser des messages
  4. Gestion des connexions
← Retour à Go Academy