Guide de développement de Golang Websocket : Implémentation d'une fonction de gestion d'horaires en ligne pour plusieurs personnes
Introduction :
Avec le rythme rapide et les exigences multitâches de la vie moderne, nous devons souvent procéder à des ajustements et à une coordination des horaires. La fonction de gestion des horaires en ligne pour plusieurs personnes peut aider plusieurs personnes à collaborer et à partager des horaires en temps réel, améliorant ainsi l'efficacité du travail. Cet article expliquera comment utiliser la technologie Golang et Websocket pour implémenter des fonctions de gestion d'horaires en ligne pour plusieurs personnes et joindra des exemples de code spécifiques.
Projet de création et initialisation :
Tout d'abord, nous devons créer un projet Golang vide et le placer dans le répertoire racine du projet Initialisez un nouveau module Go à l'aide de la commande suivante :
go mod init schedule
Ensuite, nous devons introduire les dépendances requises dans le projet :
go get -u github.com/gin-gonic/gin go get -u github.com/gorilla/websocket
main.go
et ajoutez le code suivant dans le fichier : main.go
的文件,并在文件中添加以下代码:package main import ( "log" "net/http" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" ) func main() { router := gin.Default() upgrader := websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } router.GET("/ws", func(c *gin.Context) { conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { log.Println("Failed to upgrade connection:", err) return } // TODO: 处理连接和消息 }) router.Run(":8000") }
上述代码中,我们使用了Gin框架创建了一个简单的HTTP服务器,并在/ws
路径上注册了一个Websocket路由。在路由处理函数中,我们将Upgrade HTTP连接升级为Websocket连接,并获取到与客户端建立的连接。
connections := make(map[*websocket.Conn]bool) // 存储所有连接的映射表 router.GET("/ws", func(c *gin.Context) { conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { log.Println("Failed to upgrade connection:", err) return } connections[conn] = true for { _, msg, err := conn.ReadMessage() if err != nil { log.Println("Error reading message:", err) delete(connections, conn) conn.Close() break } // 广播消息给所有连接 for conn := range connections { err := conn.WriteMessage(websocket.TextMessage, msg) if err != nil { log.Println("Error broadcasting message:", err) delete(connections, conn) conn.Close() } } } })
上面的代码中,我们使用一个映射表connections
来存储所有连接。当有新的连接建立时,我们将该连接添加到映射表中。同时,我们通过一个无限循环来读取来自客户端的消息,并将该消息广播给所有连接。
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Schedule</title> </head> <body> <h1>Schedule</h1> <input type="text" id="message" placeholder="Enter your message"> <button id="send">Send</button> <ul id="messages"></ul> <script> const socket = new WebSocket("ws://localhost:8000/ws"); const messageInput = document.getElementById("message"); const sendButton = document.getElementById("send"); const messagesList = document.getElementById("messages"); sendButton.addEventListener("click", () => { const message = messageInput.value; socket.send(message); messageInput.value = ""; }); socket.addEventListener("message", (event) => { const message = document.createElement("li"); message.innerHTML = event.data; messagesList.appendChild(message); }); </script> </body> </html>
/ws
. Dans la fonction de traitement de routage, nous mettons à niveau la connexion HTTP de mise à niveau vers une connexion Websocket et obtenons la connexion établie avec le client.
Dans notre serveur Websocket, nous devons implémenter des fonctions de traitement des connexions et de diffusion des messages. Ajoutez le code suivant dans la fonction de traitement des routes :
Dans le code ci-dessus, nous utilisons une table de mappage connections
pour stocker toutes les connexions. Lorsqu'une nouvelle connexion est établie, nous ajoutons la connexion à la table de mappage. En même temps, nous lisons le message du client via une boucle infinie et diffusons le message à toutes les connexions.
index.html
et ajoutez le code suivant dans le fichier : 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!