Maison > développement back-end > Golang > Golang implémente Websocket

Golang implémente Websocket

王林
Libérer: 2023-05-22 14:45:08
original
2442 Les gens l'ont consulté

Avec le développement continu de la technologie Internet, la connexion en temps réel est devenue une fonction essentielle pour de plus en plus d'applications. WebSocket est un protocole réseau basé sur le protocole TCP qui permet au serveur de transmettre des données au client pour établir une communication bidirectionnelle en temps réel.

Go est un langage de programmation rapide et efficace De par sa simplicité et son efficacité, il est devenu l'un des langages les plus populaires ces dernières années. Dans cet article, nous présenterons comment implémenter le service WebSocket à l'aide du langage Go.

Qu'est-ce que WebSocket

Le protocole WebSocket est un protocole de communication full-duplex basé sur le protocole TCP qui permet une communication en temps réel entre le client et le serveur. Par rapport au mode de requête et de réponse HTTP traditionnel, WebSocket peut maintenir l'état de connexion une fois la connexion établie, permettant ainsi une communication bidirectionnelle en temps réel.

Le workflow du protocole WebSocket est le suivant :

  1. Le client initie une demande de connexion WebSocket.
  2. Après avoir reçu la demande, le serveur exécute un protocole de prise de contact pour confirmer que la connexion WebSocket peut être utilisée.
  3. Une fois la connexion WebSocket établie, le client et le serveur peuvent établir une communication bidirectionnelle en temps réel.
  4. Si le serveur a besoin d'envoyer des données au client, il peut les envoyer directement au client et vice versa.

Par rapport aux requêtes HTTP traditionnelles, les avantages de WebSocket sont les suivants :

  1. Communication bidirectionnelle en temps réel, adaptée aux scénarios d'application en temps réel tels que les jeux en ligne, le chat en temps réel et la vidéo en ligne.
  2. Moins de demandes et de réponses, réduisant la consommation de bande passante du réseau et améliorant l'efficacité de la transmission des données.

Go implémente WebSocket

Go est un langage émergent En raison de sa simplicité, de son efficacité, de sa sécurité et d'autres caractéristiques, de plus en plus d'équipes commencent à utiliser Go pour développer des applications réseau. Dans Go, il existe une bibliothèque standard net/http qui fournit des API pour implémenter les services HTTP et WebSocket.

Établir une connexion WebSocket

Pour établir une connexion WebSocket, nous devons effectuer les opérations suivantes respectivement sur le serveur et le client :

Serveur

  1. Créez un service HTTP et utilisez le http.HandleFunc fonction pour enregistrer un routeur et permet à la fonction de traitement de routage correspondante d'effectuer une communication WebSocket. http.HandleFunc 函数注册一个路由器,并允许对应的路由处理函数进行 WebSocket 通信。
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    // 判断是否支持 WebSocket,如果支持则进入 WebSocket 通信处理函数。
    if websocket.IsWebSocketUpgrade(r) {
        websocket.Handler(handleWebSocket).ServeHTTP(w, r)
        return
    }

    http.ServeFile(w, r, "index.html")
})
Copier après la connexion
  1. 在 WebSocket 通信处理函数中进行建立连接操作。
func handleWebSocket(conn *websocket.Conn) {
    defer conn.Close()

    // 输出日志信息,表示已经建立连接。
    log.Println("WebSocket connected")

    for {
        // 读取客户端发送过来的消息。
        _, msg, err := conn.ReadMessage()
        if err != nil {
            log.Println("Read error:", err)
            return
        }

        // 输出日志信息,表示接收到客户端发送的消息。
        log.Printf("Received: %s
", msg)

        // 处理完毕后,发送消息。
        err = conn.WriteMessage(websocket.TextMessage, msg)
        if err != nil {
            log.Println("Write error:", err)
            return
        }
    }
}
Copier après la connexion

客户端

在客户端中,我们需要使用 JavaScript 代码进行 WebSocket 连接的操作。具体代码如下:

var socket = new WebSocket("ws://127.0.0.1:8080/");

socket.onopen = function() {
  console.log("WebSocket connected");
};

socket.onmessage = function(event) {
  console.log("Received: " + event.data);
};

socket.onclose = function(event) {
  console.log("WebSocket closed");
};

socket.onerror = function(event) {
  console.log("WebSocket error: " + event.data);
};
Copier après la connexion

发送消息

当 WebSocket 连接建立后,服务端和客户端就可以进行实时双向通信了。服务端可以通过 conn.WriteMessage 函数向客户端发送消息,客户端可以通过 socket.send 函数向服务端发送消息。

从客户端发送消息:

socket.send("Hello world");
Copier après la connexion

在服务端接收并处理消息:

_, msg, err := conn.ReadMessage()
if err != nil {
    log.Println("Read error:", err)
    return
}

log.Printf("Received: %s
", msg)
Copier après la connexion

从服务端发送消息:

err = conn.WriteMessage(websocket.TextMessage, []byte("Hello world"))
if err != nil {
    log.Println("Write error:", err)
    return
}
Copier après la connexion

在客户端接收并处理消息:

socket.onmessage = function(event) {
    console.log("Received: " + event.data);
};
Copier après la connexion

WebSocket 的错误处理

在实际开发中,WebSocket 可能会出现各种异常情况,例如网络中断、连接超时、服务器崩溃等。在 Go 中,我们可以通过错误处理来处理这些异常情况。

在服务端中,我们可以通过 defer 语句来进行资源释放,例如关闭 WebSocket 连接等。

defer conn.Close()
Copier après la connexion

同时,在进行 websocket 通信处理函数的过程中,我们需要对可能发生的错误进行预处理。例如:

_, msg, err := conn.ReadMessage()
if err != nil {
    log.Println("Read error:", err)
    return
}
Copier après la connexion

在客户端中,我们可以通过 onerror

socket.onerror = function(event) {
    console.log("WebSocket error: " + event.data);
};
Copier après la connexion

    Effectuer l'opération d'établissement de connexion dans la fonction de traitement des communications WebSocket.

    rrreee

    Client🎜🎜Dans le client, nous devons utiliser du code JavaScript pour faire fonctionner la connexion WebSocket. Le code spécifique est le suivant : 🎜rrreee🎜Envoyer un message🎜🎜Lorsque la connexion WebSocket est établie, le serveur et le client peuvent établir une communication bidirectionnelle en temps réel. Le serveur peut envoyer des messages au client via la fonction conn.WriteMessage, et le client peut envoyer des messages au serveur via la fonction socket.send. 🎜🎜Envoyer un message du client : 🎜rrreee🎜Recevoir et traiter le message sur le serveur : 🎜rrreee🎜Envoyer un message depuis le serveur : 🎜rrreee🎜Recevoir et traiter le message sur le client : 🎜rrreee🎜Gestion des erreurs WebSocket🎜 🎜En pratique Lors du développement, WebSocket peut rencontrer diverses situations anormales, telles qu'une interruption du réseau, un timeout de connexion, un crash du serveur, etc. Dans Go, nous pouvons gérer ces exceptions grâce à la gestion des erreurs. 🎜🎜Côté serveur, nous pouvons utiliser l'instruction defer pour libérer des ressources, comme la fermeture de la connexion WebSocket, etc. 🎜rrreee🎜En même temps, pendant le processus de traitement des communications de Websocket, nous devons prétraiter les erreurs qui peuvent survenir. Par exemple : 🎜rrreee🎜Dans le client, nous pouvons gérer les erreurs WebSocket via l'événement onerror, par exemple : 🎜rrreee🎜Summary🎜🎜Cet article présente comment utiliser le langage Go pour implémenter les services WebSocket, y compris l'établissement d'une connexion WebSocket, l'envoi de messages, la gestion des exceptions, etc. Le protocole WebSocket fournit une méthode de communication bidirectionnelle en temps réel et peut être utilisé dans des scénarios d'application en temps réel tels que les jeux en ligne, le chat en temps réel et la vidéo en ligne. Dans Go, le service WebSocket peut être facilement implémenté à l'aide de l'API fournie par la bibliothèque standard net/http. 🎜

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!

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