


Implémentation du serveur Websocket à l'aide de la bibliothèque x/net trowing 403
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.
Contenu de la question
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
Solution de contournement
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Il existe deux manières d'obtenir des valeurs absolues en C++ : 1. Utilisez la fonction intégrée abs() pour obtenir la valeur absolue d'un type entier ou à virgule flottante 2. Utilisez la fonction générique std::abs() pour ; obtenir diverses valeurs absolues prises en charge. Fonctionne sur les valeurs absolues des types de données.

std est l'espace de noms en C++ qui contient les composants de la bibliothèque standard. Pour utiliser std, utilisez l'instruction "using namespace std;". L'utilisation de symboles directement à partir de l'espace de noms std peut simplifier votre code, mais n'est recommandée que lorsque cela est nécessaire pour éviter la pollution de l'espace de noms.

prime est un mot-clé en C++, indiquant le type de nombre premier, qui ne peut être divisé que par 1 et lui-même. Il est utilisé comme type booléen pour indiquer si la valeur donnée est un nombre premier. S'il s'agit d'un nombre premier, c'est le cas. vrai, sinon c'est faux.

La fonction fabs() est une fonction mathématique en C++ qui calcule la valeur absolue d'un nombre à virgule flottante, supprime le signe négatif et renvoie une valeur positive. Il accepte un paramètre à virgule flottante et renvoie une valeur absolue de type double. Par exemple, fabs(-5.5) renvoie 5,5. Cette fonction fonctionne avec des nombres à virgule flottante, dont la précision est affectée par le matériel sous-jacent.

Config représente les informations de configuration en Java et est utilisé pour ajuster le comportement de l'application. Il est généralement stocké dans des fichiers ou des bases de données externes et peut être géré via Java Properties, PropertyResourceBundle, Java Configuration Framework ou des bibliothèques tierces. Ses avantages incluent le découplage et la flexibilité. sensibilisation à l'environnement, gérabilité, évolutivité.

Le type complexe est utilisé pour représenter des nombres complexes en langage C, y compris des parties réelles et imaginaires. Sa forme d'initialisation est complex_number = 3.14 + 2.71i, la partie réelle est accessible via creal(complex_number) et la partie imaginaire est accessible via cimag(complex_number). Ce type prend en charge les opérations mathématiques courantes telles que l'addition, la soustraction, la multiplication, la division et le modulo. De plus, un ensemble de fonctions permettant de travailler avec des nombres complexes est fourni, telles que cpow, csqrt, cexp et csin.

La fonction min en C++ renvoie le minimum de plusieurs valeurs. La syntaxe est : min(a, b), où a et b sont les valeurs à comparer. Vous pouvez également spécifier une fonction de comparaison pour prendre en charge les types qui ne prennent pas en charge l'opérateur <. C++20 a introduit la fonction std::clamp, qui gère le minimum de trois valeurs ou plus.

Il existe trois façons de trouver la valeur absolue en C++ : À l’aide de la fonction abs(), vous pouvez calculer la valeur absolue de n’importe quel type de nombre. À l'aide de la fonction std::abs(), vous pouvez calculer la valeur absolue d'entiers, de nombres à virgule flottante et de nombres complexes. Calcul manuel de valeurs absolues, adapté aux entiers simples.
