


So implementieren Sie http.Hijacker mit Gorilla Websockets und alexedwards/scs/v2
Der Herausgeber von PHP Apple stellt Ihnen heute eine Methode zur Implementierung von http.Hijacker mithilfe von Gorilla Websockets und der Bibliothek alexedwards/scs/v2 vor. Diese Methode kann Entwicklern dabei helfen, Echtzeit-Kommunikationsfunktionen in ihren eigenen Anwendungen zu implementieren. Unabhängig davon, ob es sich um einen Chatroom oder Echtzeit-Updates usw. handelt, kann sie auf diese Weise implementiert werden. Als nächstes erklären wir im Detail, wie Sie diese beiden Bibliotheken verwenden, um http.Hijacker zu implementieren und Ihre Anwendung leistungsfähiger und flexibler zu machen.
Frageninhalt
Die hervorragenden alexedwards/scs/v2 in Go-Webanwendungen wurden kürzlich von 2.5.0 auf 2.7.0 aktualisiert, damit Go 1.20+ http.NewResponseController() unterstützen kann. Ermöglichen Sie anschließend das erweiterungshandlerspezifische serverseitige Schreib-Timeout für das Hochladen großer Dateien. Das ist gut. Eine bedauerliche Folge dieses notwendigen Upgrades ist der Verlust der Websocket-Funktionalität, die derzeit Gorilla Websockets v1.5.1 (neueste Version) verwendet. Ich erhalte eine häufige Fehlermeldung, wenn ich versuche, eine Verbindung zum Upgrade herzustellen ... websocket: Antwort nicht implementiert http.Hijacker Ich habe mir ein paar Threads zu diesem Thema angesehen, einige davon auf SO, aber ich konnte nichts Spezielles zu diesem Fall klären. Ich habe ein paar Dinge ausprobiert, um http.Hijacker zusammen mit meinem anderen Middleware-Code in meinen Websocket-Endpunkt-Handler zu implementieren (auskommentiert, zur Veranschaulichung ein „irreführendes“ Beispiel angehängt) ... Ich glaube einfach, dass ich das nicht gut genug verstehe. ..
type WebsocketConnection struct { *websocket.Conn } type WebsocketPayload struct { Action string `json:"action"` Message string `json:"message"` AdminName string `json:"admin_name"` MessageType string `json:"message_type"` AdminID int `json:"admin_id"` Connection WebsocketConnection `json:"-"` } type WebsocketJSONResponse struct { Action string `json:"action"` Message string `json:"message"` AdminName string `json:"admin_name"` AdminID int `json:"admin_id"` CurrentLogins []string `json:"current_logins"` } var upgradeConnection = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, CheckOrigin: func(r *http.Request) bool { return true }, } var webClients = make(map[WebsocketConnection]string) var websocketChannel = make(chan WebsocketPayload) func (app *application) WebsocketEndPoint(w http.ResponseWriter, r *http.Request) { // rc := http.NewResponseController(w) // netConn, _, err := rc.Hijack() // if err != nil { // app.errorLog.Println(err) // return // } // defer netConn.Close() app.debugLog.Printf("w's type is %T\n", w) ws, err := upgradeConnection.Upgrade(w, r, nil) if err != nil { app.errorLog.Println(err) <= ERROR HERE return } app.infoLog.Printf("Web client connected from %s", r.RemoteAddr) var response WebsocketJSONResponse response.Message = "Connected to server..." err = ws.WriteJSON(response) if err != nil { app.errorLog.Println(err) return } conn := WebsocketConnection{Conn: ws} webClients[conn] = "" go app.ListenForWebsocket(&conn) }
Das „w“ in diesem Beispiel ist *scs.sessionResponseWriter. Wie kann ich http.Hijacker in der Antwort implementieren, ohne die Verbindung zu unterbrechen und ein Upgrade durchzuführen? Was ist der richtige Ansatz?
Problemumgehung
alexedwards/scs/v2-Paketversion 2.5.0 unterstützt die Hijacker-Schnittstelle. Version 2.7.0 unterstützt die Hijacker-Schnittstelle nicht, unterstützt aber unterstützt Response Controller. Das Gorilla-Websocket-Paket verwendet keine Antwort-Controller.
Option 1
Verwendung von 2.5.0 des alexedwards/scs/v2-Pakets.
Option 2
Beheben Sie den Fehler im Gorilla-Paket, indem Sie den Antwortschreiber in Ihrem Anwendungscode entpacken:
func (app *application) WebsocketEndPoint(w http.ResponseWriter, r *http.Request) { wupgrade := w if u, ok := w.(interface{ Unwrap() http.ResponseWriter }); ok { wupgrade = u.Unwrap() } app.debugLog.Printf("w's type is %T\n", w) ws, err := upgradeConnection.Upgrade(wupgrade, r, nil) if err != nil { app.errorLog.Println(err) return } app.infoLog.Printf("Web client connected from %s", r.RemoteAddr) var response WebsocketJSONResponse response.Message = "Connected to server..." err = ws.WriteJSON(response) if err != nil { app.errorLog.Println(err) return } conn := WebsocketConnection{Conn: ws} webClients[conn] = "" go app.ListenForWebsocket(&conn) }
Das obige ist der detaillierte Inhalt vonSo implementieren Sie http.Hijacker mit Gorilla Websockets und alexedwards/scs/v2. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen





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.

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. � ...

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

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, ...

Der Unterschied zwischen Stringdruck in GO -Sprache: Der Unterschied in der Wirkung der Verwendung von Println und String () ist in Go ...

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

Das Problem der Verwendung von RETISTREAM zur Implementierung von Nachrichtenwarteschlangen in der GO -Sprache besteht darin, die Go -Sprache und Redis zu verwenden ...

Zwei Möglichkeiten, Strukturen in der GO -Sprache zu definieren: Der Unterschied zwischen VAR- und Typ -Schlüsselwörtern. Bei der Definition von Strukturen sieht die Sprache oft zwei verschiedene Schreibweisen: Erstens ...
