PHP Editor Banana vous présentera une méthode utilisant la bibliothèque x/net pour implémenter un serveur Websocket qui renvoie une erreur 403. Websocket est un protocole de communication qui établit une connexion persistante entre un client et un serveur, et une erreur 403 signifie que le serveur a rejeté la demande du client. En utilisant la bibliothèque x/net, nous pouvons facilement créer un serveur Websocket et rejeter les requêtes en lançant une erreur 403 si nécessaire. Cette méthode est simple et efficace et convient aux scénarios dans lesquels les demandes doivent être autorisées ou l'accès restreint.
J'essaie d'implémenter un serveur websocket en utilisant la x/net/websocket
bibliothèque standard.
Mes tentatives jusqu'à présent sont les suivantes :
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() }
Essayez d'utiliser plusieurs clients ws pour vous connecter à ws://localhost:3000/ws
时,我总是收到相同的错误:403-Forbidden
.
J'ai même essayé l'exemple de la documentation officielle mais je l'obtiens toujours. Est-ce que j'ai raté quelque chose d'évident ? Comme le blocage de port par défaut ou quelque chose comme ça ?
Merci d'avance.
EDIT : vous devrez peut-être utiliser un autre port pour reproduire le problème. Utiliser 3000
dans mon exemple interrompra simplement l'exécution du programme s'il n'est pas disponible.
Edit 2 : Vous pouvez utiliser un client comme websocat et exécuter websocat 'ws://localhost:3000/ws'
pour essayer de vous connecter au serveur
J'ai abandonné, mais j'ai de bonnes idées : Si vous êtes comme moi et que vous suivez la Procédure pas à pas de création d'un serveur Websocket en déplacement à partir de zéro d'Anthony GG, ne le faites pas. La vidéo est obsolète et, même si elle fournit une bonne intuition sur la façon de créer des vidéos, il est préférable (et sans honte) d'apprendre à utiliser la bibliothèque Websocket de Gorilla.
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() }
J'utilise également gorilla/mux
pour utiliser les paramètres de chemin (je ne sais pas pourquoi le gestionnaire http ne le peut pas).
Remarquez comment j'ai ajouté http.Handle
更改为 mux.Router.HandleFunc
.
Comme l'a souligné l'utilisateur @Cerise dans les commentaires, le package x/net/websocket
包不在标准库中,但仅添加 Origin
n'est pas dans la bibliothèque standard, mais le simple ajout de l'en-tête Origin
n'a pas non plus résolu le problème d'origine.
J'espère que cela évitera une partie des problèmes que d'autres personnes comme moi rencontrent lors de l'apprentissage du Go.
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!