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