Maison >développement back-end >Golang >Comment mettre en œuvre une salle de discussion en ligne en utilisant le langage Go et Redis

Comment mettre en œuvre une salle de discussion en ligne en utilisant le langage Go et Redis

PHPz
PHPzoriginal
2023-10-27 15:28:431073parcourir

Comment mettre en œuvre une salle de discussion en ligne en utilisant le langage Go et Redis

Comment mettre en œuvre un salon de discussion en ligne en utilisant le langage Go et Redis

Introduction :
Avec le développement rapide d'Internet, les réseaux sociaux sont devenus un élément indispensable de la vie quotidienne des gens. En tant qu'élément important des réseaux sociaux, les forums de discussion en ligne sont populaires parmi les gens pour leur commodité, leur temps réel et leur forte interactivité. Cet article est basé sur le langage Go et Redis et présente comment utiliser ces deux outils pour mettre en œuvre un salon de discussion en ligne simple.

1. Introduction au langage Go :
Le langage Go est un langage de programmation système open source pour les systèmes d'exploitation modernes. Il a été développé par Google et publié en 2012. Le langage Go est efficace, fiable et concis et convient à la création d'applications réseau et de serveurs hautes performances.

2. Introduction à Redis :
Redis est une base de données de stockage clé-valeur hautes performances basée sur la mémoire et open source qui peut être utilisée comme base de données, cache et middleware de messages. Redis prend en charge des structures de données riches telles que des chaînes, des hachages, des listes, des ensembles, des ensembles ordonnés, etc., ce qui le rend idéal pour une utilisation avec des applications en temps réel et des salons de discussion en ligne.

3. Étapes pour mettre en œuvre un salon de discussion en ligne :

  1. Créer un serveur backend Go :
    Tout d'abord, vous devez créer un serveur backend écrit en Go pour recevoir et traiter les demandes des clients. Voici un exemple de code simple :
package main

import (
    "github.com/gin-gonic/gin" //引入gin框架
)

func main() {
    router := gin.Default() //创建一个gin实例
    router.GET("/chat", func(c *gin.Context) {
        //处理websocket连接
    })

    go router.Run(":8080") //启动服务器,监听8080端口
    select {}
}
  1. Gestion des connexions WebSocket :
    Dans le code ci-dessus, nous avons créé une fonction de traitement de route "/chat" pour gérer les connexions WebSocket. Ensuite, nous pouvons gérer la connexion WebSocket et l'envoi de messages via l'objet contextuel c du framework gin.
package main

import (
    "github.com/gin-gonic/gin"
    "github.com/gorilla/websocket"
)

func main() {
    router := gin.Default()
    router.GET("/chat", func(c *gin.Context) {
        conn, _ := websocket.Upgrade(c.Writer, c.Request, nil, 1024, 1024) //升级为websocket连接
        //处理连接
        for {
            _, msg, _ := conn.ReadMessage() //读取消息
            //处理消息
            conn.WriteMessage(websocket.TextMessage, []byte("Received: "+string(msg))) //回复消息
        }
    })

    go router.Run(":8080")
    select {}
}
  1. Utilisez Redis pour stocker les enregistrements de discussion :
    Dans une salle de discussion, les enregistrements de discussion doivent être enregistrés pour une visualisation ultérieure. Ici, nous pouvons utiliser la structure de données de liste de Redis pour y parvenir. Dans le code qui gère les messages WebSocket, ajoutez la logique permettant de stocker les enregistrements de discussion dans Redis.
package main

import (
    "github.com/gin-gonic/gin"
    "github.com/gorilla/websocket"
    "github.com/go-redis/redis"
)

func main() {
    client := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379", //Redis服务器地址
        Password: "",               //Redis密码,如无则留空
        DB:       0,                //Redis数据库编号
    })

    router := gin.Default()
    router.GET("/chat", func(c *gin.Context) {
        conn, _ := websocket.Upgrade(c.Writer, c.Request, nil, 1024, 1024)
        for {
            _, msg, _ := conn.ReadMessage()
            //处理消息
            conn.WriteMessage(websocket.TextMessage, []byte("Received: "+string(msg)))
            //将消息存储到Redis中
            client.RPush("chat_logs", msg)
        }
    })

    go router.Run(":8080")
    select {}
}
  1. Envoyer les enregistrements de chat en temps réel :
    Enfin, nous devons transmettre les enregistrements d'historique de la salle de chat à tous les clients en ligne en temps réel. Ceci peut être réalisé en utilisant la fonction de publication/abonnement de Redis. Dans le code qui gère les connexions WebSocket, ajoutez la logique pour vous abonner au canal Redis et envoyer les messages reçus au client.
package main

import (
    "github.com/gin-gonic/gin"
    "github.com/gorilla/websocket"
    "github.com/go-redis/redis"
)

func main() {
    client := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "",
        DB:       0,
    })

    pubsub := client.Subscribe("chat_logs") //订阅Redis通道
    defer pubsub.Close()

    router := gin.Default()
    router.GET("/chat", func(c *gin.Context) {
        conn, _ := websocket.Upgrade(c.Writer, c.Request, nil, 1024, 1024)
        for {
            _, msg, _ := conn.ReadMessage()
            conn.WriteMessage(websocket.TextMessage, []byte("Received: "+string(msg)))
            client.RPush("chat_logs", msg)
        }
    })

    //实时发送聊天记录
    go func() {
        for {
            msg, _ := pubsub.ReceiveMessage()
            //发送消息给所有在线的客户端
            router.RouterGroup.Broadcast([]byte(msg.Payload))
        }
    }()

    go router.Run(":8080")
    select {}
}

Résumé :
En utilisant le langage Go et Redis, nous pouvons rapidement mettre en œuvre une simple salle de discussion en ligne. La communication en temps réel entre le client et le serveur s'effectue via le protocole WebSocket, et Redis est utilisé pour stocker les enregistrements de discussion et mettre en œuvre le push en temps réel des enregistrements de discussion. Cet article fournit des exemples de code spécifiques auxquels les lecteurs peuvent se référer et dont ils peuvent tirer des leçons. Bien entendu, il ne s’agit que d’une simple implémentation. Dans les scénarios réels, de nombreux autres facteurs doivent être pris en compte, tels que l’authentification des utilisateurs, la déconnexion et la reconnexion, la persistance des messages, etc.

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:
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