Maison > développement back-end > Golang > le corps du texte

Démarrage rapide : utilisez les fonctions du langage Go pour implémenter des fonctions simples de transmission de messages

WBOY
Libérer: 2023-07-31 14:09:13
original
904 Les gens l'ont consulté

Démarrage rapide : utilisez les fonctions du langage Go pour implémenter des fonctions simples de transmission de messages

À l'ère de l'Internet mobile d'aujourd'hui, la transmission de messages est devenue une fonctionnalité standard de diverses applications. Le langage Go est un langage de programmation rapide et efficace, très adapté au développement de fonctions de transmission de messages. Cet article expliquera comment utiliser les fonctions du langage Go pour implémenter une simple fonction de transmission de messages et fournira des exemples de code correspondants pour aider les lecteurs à démarrer rapidement.

Avant de commencer, nous devons comprendre les principes de base du message push. En règle générale, la fonctionnalité de transmission de messages nécessite deux composants principaux : un serveur push et un client de réception. Le serveur push est chargé de recevoir les messages envoyés par les clients et de les transmettre aux clients récepteurs correspondants. Le client destinataire est responsable de la réception du message poussé et de son traitement en conséquence.

Tout d’abord, créons un simple serveur push. Nous utilisons le package net/http dans le langage Go pour créer un serveur HTTP et utilisons le protocole WebSocket pour le push de messages. Voici un exemple de code pour un simple serveur push :

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

var clients = make(map[*websocket.Conn]bool) // 存储所有连接的客户端

var broadcast = make(chan []byte) // 接收消息的通道

var upgrader = websocket.Upgrader{} // WebSocket升级器

func main() {
    http.HandleFunc("/", handleMessage)
    go handleMessages()
    log.Println("Server running on :8080")
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

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

    // 将连接添加到clients映射表中
    clients[conn] = true

    // 关闭连接时从clients映射表中删除连接
    defer func() {
        delete(clients, conn)
        conn.Close()
    }()

    for {
        // 读取客户端发送的消息
        _, message, err := conn.ReadMessage()
        if err != nil {
            log.Println(err)
            break
        }

        // 将消息发送到broadcast通道中
        broadcast <- message
    }
}

func handleMessages() {
    for {
        // 从broadcast通道中读取消息
        message := <-broadcast

        // 向所有连接的客户端发送消息
        for client := range clients {
            err := client.WriteMessage(websocket.TextMessage, message)
            if err != nil {
                log.Println(err)
                client.Close()
                delete(clients, client)
            }
        }
    }
}
Copier après la connexion

Le code ci-dessus crée un serveur WebSocket et implémente la logique pour gérer les connexions, recevoir des messages et envoyer des messages. Lorsqu'un nouveau client se connecte au serveur, le serveur l'ajoute à la table de mappage des clients, traite le message reçu via la coroutine et l'envoie à tous les clients.

Ensuite, écrivons un client simple pour recevoir et afficher les messages poussés par le serveur. Ce qui suit est un exemple de code pour un client simple basé sur la ligne de commande :

package main

import (
    "fmt"
    "log"
    "net/url"
    "os"
    "os/signal"
    "time"

    "github.com/gorilla/websocket"
)

func main() {
    interrupt := make(chan os.Signal, 1)
    signal.Notify(interrupt, os.Interrupt)

    u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/"}
    log.Printf("connecting to %s", u.String())

    c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
    if err != nil {
        log.Fatal("dial:", err)
    }
    defer c.Close()

    done := make(chan struct{})

    // 接收和显示服务器推送的消息
    go func() {
        defer close(done)
        for {
            _, message, err := c.ReadMessage()
            if err != nil {
                log.Println("read:", err)
                return
            }
            fmt.Printf("received: %s
", message)
        }
    }()

    for {
        select {
        case <-done:
            return
        case <-interrupt:
            log.Println("interrupt")
            // 断开与服务器的连接
            err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
            if err != nil {
                log.Println("write close:", err)
                return
            }
            select {
            case <-done:
            case <-time.After(time.Second):
            }
            return
        }
    }
}
Copier après la connexion

Le code ci-dessus crée un client WebSocket, se connecte au serveur que nous avons créé précédemment, et reçoit et affiche les messages poussés par le serveur en temps réel via le coroutine. Lorsqu'un signal d'interruption est reçu, le client se déconnecte du serveur.

En exécutant les deux morceaux de code ci-dessus, nous pouvons simuler un simple système de transmission de messages dans la ligne de commande. Lorsque l'utilisateur saisit un message, le serveur le transmettra à tous les clients et l'affichera sur le client. Ceci n'est qu'un exemple simple, vous pouvez l'étendre et le personnaliser en fonction de vos besoins réels.

Résumé
Cet article explique comment utiliser les fonctions du langage Go pour implémenter une simple fonction de transmission de messages. Nous avons créé un serveur push WebSocket et écrit un client simple pour recevoir et afficher les messages poussés par le serveur. Grâce à l'exemple de code présenté dans cet article, les lecteurs peuvent rapidement démarrer et comprendre les principes de base du langage Go pour implémenter la fonction de transmission de messages.

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!

Étiquettes associées:
source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal