Heim Backend-Entwicklung Golang Golang baut einen WebSocket

Golang baut einen WebSocket

May 22, 2023 pm 07:21 PM

Golang ist eine schnell kompilierbare, effiziente und sichere Programmiersprache, die auch in der Webentwicklung weit verbreitet ist. Unter diesen ist die Verwendung von Golang zum Erstellen von Websocket ein sehr beliebtes Anwendungsszenario. In diesem Artikel wird erläutert, wie Sie mit Golang eine Websocket-Anwendung erstellen.

1. Was ist Websocket? Websocket ist ein Protokoll, das den Aufbau einer bidirektionalen Kommunikationsverbindung zwischen dem Browser und dem Server ermöglicht. Das herkömmliche HTTP-Protokoll kann vom Browser nur Anfragen an den Server senden und Antworten vom Server empfangen. Durch die Verwendung von Websocket kann der Server jedoch aktiv Nachrichten an den Browser senden und so eine Vollduplex-Kommunikation zwischen dem Server und dem Browser realisieren.

2. Wie Golang Websocket implementiert: Golang wird mit einer Standardbibliothek net/http geliefert. Dieses Paket stellt eine http.Server-Struktur bereit, mit der ein Web erstellt werden kann Server. Darüber hinaus stellt net/http auch ein Unterpaket websocket bereit, das uns alle Funktionen zur Verfügung stellt, die zum Aufbau eines WebSocket-Servers erforderlich sind.

  1. Herstellen einer WebSocket-Verbindung

Um eine WebSocket-Verbindung herzustellen, muss der Client eine HTTP-Anfrage an den Server senden und den Upgrade-Header tragen, um anzuzeigen, dass die Anfrage aktualisiert wird das WebSocket-Protokoll. Nach Erhalt dieser Anfrage muss der Server den Upgrade-Header überprüfen und ihn entsprechend verarbeiten, je nachdem, ob es sich um eine WebSocket-Anfrage handelt.

Der Server kann die Funktion websocket.IsWebSocketUpgrade verwenden, um zu prüfen, ob es sich bei der Anfrage um eine WebSocket-Anfrage handelt, und die Funktion websocket.Upgrade verwenden, um die Anfrage zu aktualisieren. Nach erfolgreichem Upgrade kann der Server über ein Verbindungsobjekt vom Typ *websocket.Conn mit dem Client kommunizieren. net/http,这个包提供了一个http.Server结构体,它可以用来构建Web服务器。除此之外,net/http也提供了一个websocket子包,它为我们提供了构建WebSocket服务器所需的全部功能。

  1. 建立WebSocket连接

要建立WebSocket连接,客户端需要向服务器发送一个HTTP请求,并携带Upgrade头部,指示请求升级为WebSocket协议。服务器端在收到此请求后,需要检查Upgrade头部,并根据是否为WebSocket请求来进行相应的处理。

服务器端可以使用websocket.IsWebSocketUpgrade函数来检查请求是否为WebSocket请求,并使用websocket.Upgrade函数升级请求。升级成功后,服务器就可以通过*websocket.Conn类型的连接对象与客户端进行通信了。

func handler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
    defer conn.Close()
    // 使用conn进行通信
}
Nach dem Login kopieren

其中,upgrader是一个websocket.Upgrader类型的变量,通过设置它的属性可以控制WebSocket连接的处理方式。Upgrade函数在升级请求时会阻塞,因此要将其放在goroutine中运行。

  1. 发送和接收WebSocket消息

一旦WebSocket连接建立成功,客户端和服务器都可以通过*websocket.Conn对象进行通信。使用这个对象可以发送和接收WebSocket消息。

发送消息很简单,只需要调用WriteMessage方法即可:

err := conn.WriteMessage(websocket.TextMessage, []byte("hello"))
Nach dem Login kopieren

接收消息的方法有三种:

  • ReadMessage:阻塞读取,直到有消息到来
  • NextReader:阻塞等待下一个消息到来
  • NextWriter:返回一个io.WriteCloser对象,可以使用这个对象发送消息

一般使用ReadMessage方法接收WebSocket消息:

_, message, err := conn.ReadMessage()
if err != nil {
    log.Println(err)
    return
}
log.Printf("recv: %s", message)
Nach dem Login kopieren

三、一个简单的WebSocket应用

在这个例子中,我们将创建一个简单的聊天室应用,客户端发送消息之后,服务器将消息广播给所有连接的客户端。

客户端代码:(使用JavaScript)

<!DOCTYPE html>
<html>
<head>
    <title>Chatroom</title>
</head>
<body>
    <input type="text" id="input-message"/>
    <button onclick="sendMessage()">发送</button>
    <ul id="message-list"></ul>

    <script>
        var ws = new WebSocket("ws://localhost:8080/ws");
        ws.onmessage = function(event) {
            var message = event.data;
            var li = document.createElement("li");
            li.appendChild(document.createTextNode(message));
            document.getElementById("message-list").appendChild(li);
        };

        function sendMessage() {
            var message = document.getElementById("input-message").value;
            ws.send(message);
        }
    </script>
</body>
</html>
Nach dem Login kopieren

服务器端代码:

package main

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

    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{}

func main() {
    http.HandleFunc("/ws", wsHandler)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

func wsHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
    defer conn.Close()

    for {
        _, message, err := conn.ReadMessage()
        if err != nil {
            log.Println(err)
            break
        }
        fmt.Printf("recv: %s
", message)

        // 广播给所有客户端
        for _, conn := range conns {
            err := conn.WriteMessage(websocket.TextMessage, message)
            if err != nil {
                log.Println(err)
                break
            }
        }
    }
}
Nach dem Login kopieren

在上面的代码中,我们将所有连接的websocket.Conn对象存储在conns变量中。每当有一个新消息到来时,服务器会将消息广播给所有客户端。

总结

使用Golang搭建WebSocket应用程序非常简单,只需要导入net/httpwebsocketrrreee

Unter anderem ist upgrader eine Variable vom Typ websocket.Upgrader. Durch Festlegen ihrer Eigenschaften können Sie die Verarbeitungsmethode der WebSocket-Verbindung steuern. Die Funktion Upgrade blockiert das Upgrade der Anfrage und muss daher in einer Goroutine ausgeführt werden. 🎜
  1. WebSocket-Nachrichten senden und empfangen
🎜Sobald die WebSocket-Verbindung erfolgreich hergestellt wurde, können sowohl der Client als auch der Server *websocket.Conn Objekte kommunizieren. Verwenden Sie dieses Objekt zum Senden und Empfangen von WebSocket-Nachrichten. 🎜🎜Das Senden einer Nachricht ist sehr einfach. Rufen Sie einfach die Methode <code>WriteMessage auf: 🎜rrreee🎜Es gibt drei Möglichkeiten, Nachrichten zu empfangen: 🎜
  • ReadMessage: Blockierung Lesen Abrufen, bis eine Nachricht eintrifft
  • NextReader: Blockiert das Warten auf das Eintreffen der nächsten Nachricht
  • NextWriter: Gibt einen io .WriteCloser-Objekt, Sie können dieses Objekt zum Senden von Nachrichten verwenden
🎜Verwenden Sie im Allgemeinen die ReadMessage-Methode, um WebSocket-Nachrichten zu empfangen: 🎜rrreee🎜 3. A einfache WebSocket-Anwendung🎜🎜 In diesem Beispiel erstellen wir eine einfache Chatroom-Anwendung. Nachdem der Client eine Nachricht gesendet hat, sendet der Server die Nachricht an alle verbundenen Clients. 🎜🎜Clientseitiger Code: (unter Verwendung von JavaScript) 🎜rrreee🎜Serverseitiger Code: 🎜rrreee🎜Im obigen Code speichern wir alle verbundenen websocket.Conn-Objekte im conns-Code > variabel. Immer wenn eine neue Nachricht eintrifft, sendet der Server die Nachricht an alle Clients. 🎜🎜Zusammenfassung🎜🎜Es ist sehr einfach, eine WebSocket-Anwendung mit Golang zu erstellen. Sie müssen nur die Pakete <code>net/http und websocket importieren und die bereitgestellte API direkt verwenden durch die Standardbibliothek, um die Entwicklung von WebSocket-Anwendungen abzuschließen. Ich hoffe, dass dieser Artikel für die Entwicklung von Golang Websocket hilfreich sein kann. 🎜

Das obige ist der detaillierte Inhalt vonGolang baut einen WebSocket. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was sind die Schwachstellen von Debian Openensl Was sind die Schwachstellen von Debian Openensl Apr 02, 2025 am 07:30 AM

OpenSSL bietet als Open -Source -Bibliothek, die in der sicheren Kommunikation weit verbreitet sind, Verschlüsselungsalgorithmen, Tasten und Zertifikatverwaltungsfunktionen. In seiner historischen Version sind jedoch einige Sicherheitslücken bekannt, von denen einige äußerst schädlich sind. Dieser Artikel konzentriert sich auf gemeinsame Schwachstellen und Antwortmaßnahmen für OpenSSL in Debian -Systemen. DebianopensL Bekannte Schwachstellen: OpenSSL hat mehrere schwerwiegende Schwachstellen erlebt, wie z. Ein Angreifer kann diese Sicherheitsanfälligkeit für nicht autorisierte Lesen sensibler Informationen auf dem Server verwenden, einschließlich Verschlüsselungsschlüssel usw.

Wie verwenden Sie das PPROF -Tool, um die Go -Leistung zu analysieren? Wie verwenden Sie das PPROF -Tool, um die Go -Leistung zu analysieren? Mar 21, 2025 pm 06:37 PM

In dem Artikel wird erläutert, wie das PPROF -Tool zur Analyse der GO -Leistung verwendet wird, einschließlich der Aktivierung des Profils, des Sammelns von Daten und der Identifizierung gängiger Engpässe wie CPU- und Speicherprobleme.Character Count: 159

Wie schreibt man Unit -Tests in Go? Wie schreibt man Unit -Tests in Go? Mar 21, 2025 pm 06:34 PM

In dem Artikel werden Schreiben von Unit -Tests in GO erörtert, die Best Practices, Spottechniken und Tools für ein effizientes Testmanagement abdecken.

Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Apr 02, 2025 pm 02:06 PM

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Was ist der Befehl go fmt und warum ist es wichtig? Was ist der Befehl go fmt und warum ist es wichtig? Mar 20, 2025 pm 04:21 PM

In dem Artikel wird der Befehl go fMT in Go -Programmierung erörtert, in dem Code formatiert werden, um offizielle Richtlinien für den Stil einzuhalten. Es zeigt die Bedeutung von GO FMT für die Aufrechterhaltung der Debatten mit Codekonsistenz, Lesbarkeit und Reduzierung von Stildebatten. Best Practices fo

PostgreSQL -Überwachungsmethode unter Debian PostgreSQL -Überwachungsmethode unter Debian Apr 02, 2025 am 07:27 AM

In diesem Artikel werden eine Vielzahl von Methoden und Tools eingeführt, um PostgreSQL -Datenbanken im Debian -System zu überwachen, um die Datenbankleistung vollständig zu erfassen. 1. verwenden Sie PostgreSQL, um die Überwachungsansicht zu erstellen. PostgreSQL selbst bietet mehrere Ansichten für die Überwachung von Datenbankaktivitäten: PG_STAT_ACTIVITY: Zeigt Datenbankaktivitäten in Echtzeit an, einschließlich Verbindungen, Abfragen, Transaktionen und anderen Informationen. PG_STAT_REPLIKATION: Monitore Replikationsstatus, insbesondere für Stream -Replikationscluster. PG_STAT_DATABASE: Bietet Datenbankstatistiken wie Datenbankgröße, Transaktionsausschüsse/Rollback -Zeiten und andere Schlüsselindikatoren. 2. Verwenden Sie das Log -Analyse -Tool PGBADG

Ist es vielversprechender, Java oder Golang von Front-End zu Back-End-Entwicklung zu verwandeln? Ist es vielversprechender, Java oder Golang von Front-End zu Back-End-Entwicklung zu verwandeln? Apr 02, 2025 am 09:12 AM

Backend Learning Path: Die Erkundungsreise von Front-End zu Back-End als Back-End-Anfänger, der sich von der Front-End-Entwicklung verwandelt, Sie haben bereits die Grundlage von Nodejs, ...

See all articles