


Websocket-Server-Implementierung mithilfe der X/Net-Bibliothek Trowing 403
Der PHP-Editor Banana stellt Ihnen eine Methode vor, die die x/net-Bibliothek verwendet, um einen Websocket-Server zu implementieren, der einen 403-Fehler auslöst. Websocket ist ein Kommunikationsprotokoll, das eine dauerhafte Verbindung zwischen einem Client und einem Server herstellt. Ein 403-Fehler bedeutet, dass der Server die Anfrage des Clients abgelehnt hat. Durch die Verwendung der x/net-Bibliothek können wir ganz einfach einen Websocket-Server erstellen und Anfragen ablehnen, indem wir bei Bedarf einen 403-Fehler auslösen. Diese Methode ist einfach und effektiv und eignet sich für Szenarien, in denen Anfragen autorisiert oder der Zugriff eingeschränkt werden müssen.
Frageninhalt
Ich versuche, einen Websocket-Server mithilfe der x/net/websocket
Standardbibliothek zu implementieren.
Meine bisherigen Versuche sind wie folgt:
package main import ( "fmt" "net/http" "golang.org/x/net/websocket" ) type Server struct { baseUri string connections map[string][]*websocket.Conn } func initServer(baseUri string) *Server { return &Server{ baseUri: baseUri, } } func (server *Server) handleConnections() { http.Handle("/ws", websocket.Handler(server.listenConnections)) http.ListenAndServe(":3000", nil) } func (server *Server) listenConnections(ws *websocket.Conn) { fmt.Println("New connection established") for { fmt.Println("FOO") } } func main() { server := initServer("/ws") server.handleConnections() }
Versuchen Sie, mehrere WS-Clients zu verwenden, um eine Verbindung herzustellen ws://localhost:3000/ws
时,我总是收到相同的错误:403-Forbidden
.
Ich habe sogar das Beispiel aus der offiziellen Dokumentation ausprobiert, bekomme es aber trotzdem hin. Übersehe ich etwas Offensichtliches? Zum Beispiel eine Standard-Port-Blockierung oder so etwas in der Art?
Vielen Dank im Voraus.
BEARBEITEN: Möglicherweise müssen Sie einen anderen Port verwenden, um das Problem zu reproduzieren. Die Verwendung von 3000
in meinem Beispiel unterbricht lediglich die Ausführung des Programms, wenn es nicht verfügbar ist.
Edit 2: Sie können einen Client wie websocat verwenden und websocat 'ws://localhost:3000/ws'
ausführen, um zu versuchen, eine Verbindung zum Server herzustellen
Workaround
Ich habe aufgegeben, habe aber gute Erkenntnisse:
Wenn Sie wie ich sind und Anthony GGs „Anleitung zum Erstellen eines Websocket-Servers für unterwegs von Grund auf“ folgen, dann tun Sie das nicht. Video ist veraltet, und obwohl es einen guten Einblick in die Erstellung von Videos bietet, ist es am besten (und keine Schande), die Verwendung der WebSocket-Bibliothek von Gorilla zu erlernen.
hinzugefügt habe.
Wie Benutzer @Cerise in den Kommentaren betonte, befindet sich das Das obige ist der detaillierte Inhalt vonWebsocket-Server-Implementierung mithilfe der X/Net-Bibliothek Trowing 403. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!package main
import (
"fmt"
"net/http"
"time"
"github.com/gorilla/mux"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
type Server struct {
baseUri string
connections map[string][]*websocket.Conn
router *mux.Router
setup *http.Server
}
func initServer(baseUri string) *Server {
router := mux.NewRouter()
return &Server{
baseUri: baseUri,
router: router,
setup: &http.Server{
Handler: router,
Addr: "127.0.0.1:8000",
WriteTimeout: 15 * time.Second,
ReadTimeout: 15 * time.Second,
},
}
}
func (server *Server) handleConnections() {
server.router.HandleFunc("/ws/{var}", server.listenConnections)
server.setup.ListenAndServe()
}
func (server *Server) listenConnections(w http.ResponseWriter, r *http.Request) {
connection, err := upgrader.Upgrade(w, r, nil)
if err != nil {
fmt.Println(err)
return
}
for {
_, message, err := connection.ReadMessage()
if err != nil {
break
}
connection.WriteMessage(websocket.TextMessage, message)
go messageHandler(message)
}
fmt.Println("Out of loop")
}
func messageHandler(message []byte) {
fmt.Println(string(message))
}
func main() {
server := initServer("/ws")
server.handleConnections()
}
gorilla/mux
-Paket nicht in der Standardbibliothek, aber auch das bloße Hinzufügen des Origin
-Headers hat das ursprüngliche Problem nicht gelöst. http.Handle
更改为 mux.Router.HandleFunc
x/net/websocket
包不在标准库中,但仅添加 Origin
Ich hoffe, das erspart anderen Leuten wie mir die Mühe, Go zu lernen.

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

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

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



Es gibt zwei Möglichkeiten, absolute Werte in C++ zu erhalten: 1. Verwenden Sie die integrierte Funktion abs(), um den absoluten Wert eines Ganzzahl- oder Gleitkommatyps zu erhalten. 2. Verwenden Sie die generische Funktion std::abs(), um Erhalten Sie verschiedene unterstützte absolute Werte. Arbeitet mit absoluten Werten von Datentypen.

std ist der Namespace in C++, der Komponenten der Standardbibliothek enthält. Um std zu verwenden, verwenden Sie die Anweisung „using namespace std;“. Die direkte Verwendung von Symbolen aus dem std-Namespace kann Ihren Code vereinfachen, wird jedoch nur bei Bedarf empfohlen, um eine Verschmutzung des Namespace zu vermeiden.

prime ist ein Schlüsselwort in C++, das den Primzahltyp angibt, der nur durch 1 geteilt werden kann. Es wird als boolescher Typ verwendet, um anzugeben, ob der angegebene Wert eine Primzahl ist wahr, andernfalls ist es falsch.

Die Funktion fabs() ist eine mathematische Funktion in C++, die den absoluten Wert einer Gleitkommazahl berechnet, das negative Vorzeichen entfernt und einen positiven Wert zurückgibt. Es akzeptiert einen Gleitkommaparameter und gibt einen absoluten Wert vom Typ Double zurück. Fabs(-5.5) gibt beispielsweise 5,5 zurück. Diese Funktion arbeitet mit Gleitkommazahlen, deren Genauigkeit von der zugrunde liegenden Hardware beeinflusst wird.

Config stellt Konfigurationsinformationen in Java dar und wird zum Anpassen des Anwendungsverhaltens verwendet. Es wird normalerweise in externen Dateien oder Datenbanken gespeichert und kann über Java Properties, PropertyResourceBundle oder Bibliotheken von Drittanbietern verwaltet werden. Umweltbewusstsein, Handhabbarkeit, Skalierbarkeit.

Der komplexe Typ wird zur Darstellung komplexer Zahlen in der C-Sprache verwendet, einschließlich Real- und Imaginärteilen. Seine Initialisierungsform ist complex_number = 3.14 + 2.71i, auf den Realteil kann über creal(complex_number) und auf den Imaginärteil über cimag(complex_number) zugegriffen werden. Dieser Typ unterstützt gängige mathematische Operationen wie Addition, Subtraktion, Multiplikation, Division und Modulo. Darüber hinaus wird eine Reihe von Funktionen zum Arbeiten mit komplexen Zahlen bereitgestellt, z. B. cpow, csqrt, cexp und csin.

Die min-Funktion in C++ gibt das Minimum mehrerer Werte zurück. Die Syntax lautet: min(a, b), wobei a und b die zu vergleichenden Werte sind. Sie können auch eine Vergleichsfunktion angeben, um Typen zu unterstützen, die den <-Operator nicht unterstützen. C++20 hat die Funktion std::clamp eingeführt, die mindestens drei oder mehr Werte verarbeitet.

Es gibt drei Möglichkeiten, den Absolutwert in C++ zu ermitteln: Mit der Funktion abs() können Sie den Absolutwert jeder Art von Zahl berechnen. Mit der Funktion std::abs() können Sie den Absolutwert von Ganzzahlen, Gleitkommazahlen und komplexen Zahlen berechnen. Manuelle Berechnung absoluter Werte, geeignet für einfache ganze Zahlen.
