Maison  >  Article  >  développement back-end  >  Développement Golang : utiliser Websocket pour implémenter une application de chat en temps réel

Développement Golang : utiliser Websocket pour implémenter une application de chat en temps réel

WBOY
WBOYoriginal
2023-09-20 13:15:28763parcourir

Développement Golang : utiliser Websocket pour implémenter une application de chat en temps réel

Développement Golang : application de chat en temps réel utilisant Websocket

À l'ère d'Internet d'aujourd'hui, la communication en temps réel est devenue un élément indispensable de la vie des gens. Qu'il s'agisse de messagerie instantanée, de chat en temps réel ou de mises à jour en temps réel, une méthode de communication efficace et stable est nécessaire pour y parvenir. Websocket est un protocole très adapté à la communication en temps réel.

Golang est un langage de programmation simple et efficace avec d'excellentes performances de concurrence et est très adapté au développement d'applications de communication en temps réel. Cet article expliquera comment utiliser la bibliothèque Websocket de Golang pour implémenter une application de chat en temps réel et fournira des exemples de code correspondants.

Tout d’abord, nous devons créer un projet Golang et introduire la bibliothèque Websocket de Golang.

package main

import (
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

Ensuite, nous devons définir quelques variables et structures globales.

var clients = make(map[*websocket.Conn]bool) // 客户端集合
var broadcast = make(chan Message)           // 广播消息通道

// 消息结构体
type Message struct {
    Username string `json:"username"`
    Message  string `json:"message"`
}

Ensuite, nous devons implémenter une fonction qui gère les connexions Websocket.

func handleWebSocket(w http.ResponseWriter, r *http.Request) {
    // 升级HTTP连接为Websocket连接
    upgrader := websocket.Upgrader{}
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Fatal(err)
    }

    // 将连接添加到客户端集合中
    clients[conn] = true

    // 关闭连接时,从客户端集合中移除
    defer func() {
        delete(clients, conn)
        conn.Close()
    }()

    // 循环接收和发送消息
    for {
        var message Message
        err := conn.ReadJSON(&message)
        if err != nil {
            log.Printf("error: %v", err)
            delete(clients, conn)
            break
        }
        broadcast <- message
    }
}

Ensuite, nous devons implémenter une fonction qui diffuse le message à tous les clients.

func broadcastMessages() {
    for {
        // 从广播通道中接收消息
        message := <-broadcast

        // 将消息发送给所有客户端
        for client := range clients {
            err := client.WriteJSON(message)
            if err != nil {
                log.Printf("error: %v", err)
                client.Close()
                delete(clients, client)
            }
        }
    }
}

Enfin, nous devons démarrer le serveur Websocket dans la fonction principale.

func main() {
    // 设置静态文件目录
    fs := http.FileServer(http.Dir("public"))
    http.Handle("/", fs)

    // 设置Websocket路由
    http.HandleFunc("/ws", handleWebSocket)

    // 启动Websocket服务器
    go broadcastMessages()

    // 开始监听端口
    log.Println("Server started on :8080")
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal(err)
    }
}

Ensuite, nous pouvons créer une page HTML pour implémenter l'interface utilisateur.

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <title>实时聊天应用</title>
</head>

<body>
  <h1>实时聊天应用</h1>
  
  <div id="message-container"></div>
  
  <form>
    <input type="text" id="username" placeholder="请输入用户名">
    <input type="text" id="message" placeholder="请输入消息">
    <button type="button" onclick="sendMessage()">发送</button>
  </form>

  <script>
    // 创建Websocket连接
    var socket = new WebSocket("ws://localhost:8080/ws");
    
    // 监听连接事件
    socket.onopen = function() {
      console.log("连接成功");
    };
    
    // 监听消息事件
    socket.onmessage = function(event) {
      var message = JSON.parse(event.data);
      var username = message.username;
      var content = message.message;
      var container = document.getElementById("message-container");
      container.innerHTML += "<p><b>" + username + ":</b>" + content + "</p>";
    };
    
    // 监听错误事件
    socket.onerror = function(error) {
      console.log("出现错误:" + error);
    }
    
    // 监听关闭事件
    socket.onclose = function(event) {
      console.log("连接关闭");
    }
    
    // 发送消息
    function sendMessage() {
      var username = document.getElementById("username").value;
      var message = document.getElementById("message").value;
      if (username && message) {
        var data = {
          username: username,
          message: message
        };
        socket.send(JSON.stringify(data));
        document.getElementById("message").value = "";
      }
    }
  </script>
</body>

</html>

À ce stade, nous avons réalisé un exemple d'utilisation de la bibliothèque Websocket de Golang pour implémenter une application de chat en temps réel. Grâce à cet exemple, nous pouvons comprendre en profondeur le principe de fonctionnement de Websocket et apprendre à utiliser Golang pour développer des applications de communication en temps réel.

Bien sûr, les projets réels comportent de nombreux détails et considérations de sécurité, tels que la vérification des messages, l'utilisation du cryptage SSL, etc. Mais avec cet exemple, vous disposez déjà d’un bon point de départ pour créer votre propre application de chat en direct. Bon codage !

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