Table des matières
Implémentation de Websocket
Créez une connexion Websocket
Traitement des demandes de connexion
Traitement des messages Websocket
Envoyer un message Websocket
Traitement Websocket multithread
Démarrer goroutine
Message de diffusion
Assurer la sécurité de la concurrence
Maison développement back-end Golang Comment implémenter une communication Websocket multithread à l'aide du langage Go

Comment implémenter une communication Websocket multithread à l'aide du langage Go

Dec 14, 2023 pm 01:45 PM
go语言 多线程 websocket通信

Comment implémenter une communication Websocket multithread à laide du langage Go

Ces dernières années, la communication en temps réel est devenue un besoin fondamental. WebSocket est un leader en matière de communication en temps réel. Il peut réaliser une communication en temps réel entre le client et le serveur plus rapidement et plus efficacement. Le langage Go est également devenu un langage populaire ces dernières années et est largement utilisé dans les communications en temps réel. Profitant des avantages du langage Go et des caractéristiques du traitement multithread, la fonction de communication de Websocket peut être réalisée de manière plus efficace et plus stable.

Cet article se concentrera sur le langage Go et présentera comment l'utiliser pour implémenter une communication Websocket multithread, y compris certaines implémentations de fonctions importantes, et fournira des exemples de code détaillés.

Implémentation de Websocket

Avant d'utiliser le langage Go pour implémenter la communication Websocket, vous devez comprendre certaines connaissances de base de la communication Websocket. Websocket, comme HTTP, est un protocole réseau basé sur TCP. Mais la différence est qu'il ne s'agit pas d'un mode requête et réponse, mais d'une connexion continue entre le client et le serveur, permettant une communication en temps réel entre les deux parties.

En langage Go, la première étape pour implémenter la communication Websocket est d'importer les packages "net/http" et "github.com/gorilla/websocket". Parmi eux, « net/http » est utilisé pour créer un serveur HTTP et « github.com/gorilla/websocket » est un package tiers pour Websocket. Si ce package n'est pas disponible, vous pouvez utiliser la commande "go get" pour l'installer.

import (
    "fmt"
    "net/http"
    "github.com/gorilla/websocket"
)
Copier après la connexion

Créez une connexion Websocket

Utilisez la méthode "http.HandleFunc()" pour établir une connexion Websocket en langage Go, comme indiqué ci-dessous :

func main() {
    http.HandleFunc("/", handleConnections)

    http.ListenAndServe(":4000", nil)
}
Copier après la connexion

Le code ci-dessus utilise la méthode "http.HandleFunc()" pour créer une connexion nommée fonction de traitement " handleConnections ", qui est chargée d'établir une connexion Websocket. Comme vous pouvez le voir, le chemin de requête pour établir une connexion Websocket est "/", qui est le répertoire racine.

Traitement des demandes de connexion

Après avoir établi une connexion Websocket, vous devez configurer certains paramètres de base pour la demande de connexion, tels que la mise à niveau du protocole, la taille du cache de lecture et d'écriture, le délai d'expiration du battement de cœur, etc.

var upgrader = websocket.Upgrader{
    ReadBufferSize: 1024,
    WriteBufferSize: 1024,
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}
Copier après la connexion

Le code ci-dessus est configuré à l'aide de "websocket.Upgrader", où "ReadBufferSize" et "WriteBufferSize" spécifient la taille du tampon de lecture et d'écriture, et "CheckOrigin" est défini sur "true", indiquant que toutes les demandes d'accès à la source sont acceptés. Si une source spécifique est requise, elle peut être définie en fonction d'exigences spécifiques.

Traitement des demandes de connexion

Une fois la demande de connexion Websocket traitée, la prise de contact standard du protocole Websocket doit être suivie pour la mise à niveau du protocole. En langage Go, la mise à niveau du protocole peut utiliser Upgrader pour effectuer une négociation de protocole et renvoyer le handle de connexion (conn). Le handle de connexion peut être utilisé pour envoyer et recevoir des messages pendant le cycle de vie de la connexion Websocket.

func handleConnections(w http.ResponseWriter, r *http.Request) {
    // 通过Upgrader进行协议升级
    ws, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        fmt.Println(err)
    }

    // 若协议升级成功,则跳转到另一个处理函数处理消息
    go handleMessages(ws)
}
Copier après la connexion

Dans la fonction handleConnections, le protocole est d'abord mis à niveau via Upgrader. Si la mise à niveau réussit, appelez « go handleMessages(ws) » pour démarrer goroutine et commencer à traiter les messages Websocket.

Traitement des messages Websocket

L'étape suivante consiste à traiter les messages Websocket. Dans le langage Go, vous pouvez utiliser une boucle infinie pour surveiller l'arrivée des messages Websocket, puis traiter chaque message en conséquence.

func handleMessages(ws *websocket.Conn) {
    for {
        messageType, p, err := ws.ReadMessage()
        if err != nil {
            fmt.Println(err)
            return
        }

        // 根据消息类型进行处理
        switch messageType {
        case websocket.TextMessage:
            // 处理text类型消息
            fmt.Println(string(p))
        case websocket.BinaryMessage:
            // 处理binary类型消息
            fmt.Println(p)
        }
    }
}
Copier après la connexion

Dans la fonction handleMessages, utilisez d'abord la méthode "ws.ReadMessage()" pour lire le message Websocket et le traiter en fonction du type de message.

Envoyer un message Websocket

La dernière partie est la partie d'envoi du message Websocket. Dans le langage Go, vous pouvez utiliser le handle de connexion Websocket « ws » pour envoyer des données au client.

func sendMessage(ws *websocket.Conn, messageType int, message []byte) error {
    if err := ws.WriteMessage(messageType, message); err != nil {
        return err
    }

    return nil
}
Copier après la connexion

Dans la fonction sendMessage, envoyez d'abord le message au client via la méthode "ws.WriteMessage()".

Traitement Websocket multithread

Afin d'améliorer l'efficacité de la communication Websocket, le multithread doit être utilisé pour traiter les messages Websocket. Dans le langage Go, vous pouvez utiliser goroutine pour implémenter un traitement simultané.

Démarrer goroutine

En langage Go, démarrer une goroutine est très simple, il suffit d'ajouter "go" avant la fonction.

go handleMessages(ws)
Copier après la connexion

Message de diffusion

Dans le développement réel, Websocket doit généralement implémenter des messages de diffusion, c'est-à-dire envoyer un message à tous les clients connectés. Dans le langage Go, vous pouvez utiliser une carte pour stocker tous les clients connectés, puis parcourir et envoyer des messages à chaque client tour à tour.

var clients = make(map[*websocket.Conn]bool) // 所有连接的客户端
var broadcast = make(chan []byte) // 广播通道

func main() {
    http.HandleFunc("/", handleConnections)
    go handleMessages()

    http.ListenAndServe(":4000", nil)
}

func handleConnections(w http.ResponseWriter, r *http.Request) {
    // 通过Upgrader进行协议升级
    ws, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        fmt.Println(err)
    }

    // 若协议升级成功,则将客户端存入map
    clients[ws] = true
}

func handleMessages() {
    for {
        // 从广播通道中获取消息
        message := <- broadcast
        // 对所有连接的客户端发送消息
        for client := range clients {
            if err := client.WriteMessage(websocket.TextMessage, message); err != nil {
                fmt.Println(err)
                delete(clients, client)
                return
            }
        }
    }
}
Copier après la connexion

Dans le code ci-dessus, un canal de diffusion (broadcast) est implémenté pour traiter les messages diffusés. En même temps, une carte (clients) est créée pour stocker tous les clients connectés. Dans la fonction handleConnections, lorsqu'un nouveau client se connecte, il sera stocké dans clients. Dans la fonction handleMessages, le canal de diffusion en reçoit de nouveaux messages et les envoie à tous les clients connectés.

Assurer la sécurité de la concurrence

Lorsque le multithreading traite les messages Websocket, il est nécessaire de garantir la sécurité de la concurrence des données. Dans le langage Go, vous pouvez utiliser des verrous pour le contrôle de sécurité simultanée. Dans l'exemple de code de cet article, « sync.RWMutex » est utilisé pour implémenter des verrous en lecture-écriture afin de garantir la sécurité de la concurrence.

var mutex = &sync.RWMutex{}

func handleConnections(w http.ResponseWriter, r *http.Request) {
    // 通过Upgrader进行协议升级
    ws, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        fmt.Println(err)
    }

    // 若协议升级成功,则将客户端存入map,并进行锁定
    mutex.Lock()
    clients[ws] = true
    mutex.Unlock()
}

func handleMessages() {
    for {
        // 从广播通道中获取消息,并加锁
        message := <- broadcast
        mutex.Lock()
        for client := range clients {
            if err := client.WriteMessage(websocket.TextMessage, message); err != nil {
                fmt.Println(err)
                client.Close()
                delete(clients, client)
            }
        }
        mutex.Unlock()
    }
}
Copier après la connexion

Dans la fonction handleConnections, une fois la connexion réussie, le client est ajouté à la carte et verrouillé. Dans la fonction handleMessages, verrouillez avant de traiter de nouveaux messages pour garantir la sécurité des données.

En résumé, l'utilisation du langage Go pour implémenter une communication Websocket multithread peut améliorer l'efficacité et la stabilité de la communication Websocket et peut facilement implémenter des messages de diffusion. En pratique, des fonctions plus complexes peuvent être mises en œuvre en fonction de besoins spécifiques.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Exceptions de fonctions C++ et multithreading : gestion des erreurs dans les environnements concurrents Exceptions de fonctions C++ et multithreading : gestion des erreurs dans les environnements concurrents May 04, 2024 pm 04:42 PM

La gestion des exceptions de fonction en C++ est particulièrement importante pour les environnements multithread afin de garantir la sécurité des threads et l’intégrité des données. L'instruction try-catch vous permet d'intercepter et de gérer des types spécifiques d'exceptions lorsqu'elles se produisent afin d'éviter les plantages du programme ou la corruption des données.

Comment implémenter le multi-threading en PHP ? Comment implémenter le multi-threading en PHP ? May 06, 2024 pm 09:54 PM

Le multithreading PHP fait référence à l'exécution simultanée de plusieurs tâches dans un seul processus, ce qui est réalisé en créant des threads exécutés indépendamment. Vous pouvez utiliser l'extension Pthreads en PHP pour simuler le comportement multi-threading. Après l'installation, vous pouvez utiliser la classe Thread pour créer et démarrer des threads. Par exemple, lors du traitement d'une grande quantité de données, les données peuvent être divisées en plusieurs blocs et un nombre correspondant de threads peut être créé pour un traitement simultané afin d'améliorer l'efficacité.

La différence entre les tests de performances et les tests unitaires en langage Go La différence entre les tests de performances et les tests unitaires en langage Go May 08, 2024 pm 03:09 PM

Les tests de performances évaluent les performances d'une application sous différentes charges, tandis que les tests unitaires vérifient l'exactitude d'une seule unité de code. Les tests de performances se concentrent sur la mesure du temps de réponse et du débit, tandis que les tests unitaires se concentrent sur la sortie des fonctions et la couverture du code. Les tests de performances simulent des environnements réels avec une charge et une concurrence élevées, tandis que les tests unitaires s'exécutent dans des conditions de faible charge et en série. L'objectif des tests de performances est d'identifier les goulots d'étranglement des performances et d'optimiser l'application, tandis que l'objectif des tests unitaires est de garantir l'exactitude et la robustesse du code.

Comment gérer les ressources partagées en multi-threading en C++ ? Comment gérer les ressources partagées en multi-threading en C++ ? Jun 03, 2024 am 10:28 AM

Les mutex sont utilisés en C++ pour gérer des ressources partagées multithread : créez des mutex via std::mutex. Utilisez mtx.lock() pour obtenir un mutex et fournir un accès exclusif aux ressources partagées. Utilisez mtx.unlock() pour libérer le mutex.

À quels pièges devons-nous prêter attention lors de la conception de systèmes distribués avec la technologie Golang ? À quels pièges devons-nous prêter attention lors de la conception de systèmes distribués avec la technologie Golang ? May 07, 2024 pm 12:39 PM

Pièges du langage Go lors de la conception de systèmes distribués Go est un langage populaire utilisé pour développer des systèmes distribués. Cependant, il existe certains pièges à prendre en compte lors de l'utilisation de Go qui peuvent nuire à la robustesse, aux performances et à l'exactitude de votre système. Cet article explorera quelques pièges courants et fournira des exemples pratiques sur la façon de les éviter. 1. Surutilisation de la concurrence Go est un langage de concurrence qui encourage les développeurs à utiliser des goroutines pour augmenter le parallélisme. Cependant, une utilisation excessive de la concurrence peut entraîner une instabilité du système, car trop de goroutines se disputent les ressources et entraînent une surcharge de changement de contexte. Cas pratique : une utilisation excessive de la concurrence entraîne des retards de réponse des services et une concurrence entre les ressources, qui se manifestent par une utilisation élevée du processeur et une surcharge importante de garbage collection.

Défis et contre-mesures de la gestion de la mémoire C++ dans un environnement multithread ? Défis et contre-mesures de la gestion de la mémoire C++ dans un environnement multithread ? Jun 05, 2024 pm 01:08 PM

Dans un environnement multithread, la gestion de la mémoire C++ est confrontée aux défis suivants : courses de données, blocages et fuites de mémoire. Les contre-mesures incluent : 1. L'utilisation de mécanismes de synchronisation, tels que les mutex et les variables atomiques ; 2. L'utilisation de structures de données sans verrouillage ; 3. L'utilisation de pointeurs intelligents ; 4. (Facultatif) La mise en œuvre du garbage collection ;

Défis et stratégies pour tester les programmes multithread en C++ Défis et stratégies pour tester les programmes multithread en C++ May 31, 2024 pm 06:34 PM

Les tests de programmes multithread sont confrontés à des défis tels que la non-répétabilité, les erreurs de concurrence, les blocages et le manque de visibilité. Les stratégies incluent : Tests unitaires : écrivez des tests unitaires pour chaque thread afin de vérifier le comportement du thread. Simulation multithread : utilisez un framework de simulation pour tester votre programme en contrôlant la planification des threads. Détection de courses aux données : utilisez des outils pour trouver des courses aux données potentielles, tels que valgrind. Débogage : utilisez un débogueur (tel que gdb) pour examiner l'état du programme d'exécution et trouver la source de la course aux données.

Bibliothèques technologiques Golang et outils utilisés dans l'apprentissage automatique Bibliothèques technologiques Golang et outils utilisés dans l'apprentissage automatique May 08, 2024 pm 09:42 PM

Les bibliothèques et outils d'apprentissage automatique dans le langage Go incluent : TensorFlow : une bibliothèque d'apprentissage automatique populaire qui fournit des outils pour créer, entraîner et déployer des modèles. GoLearn : Une série d'algorithmes de classification, de régression et de clustering. Gonum : Une bibliothèque de calcul scientifique qui fournit des opérations matricielles et des fonctions d'algèbre linéaire.

See all articles