


Pelaksanaan pelayan websocket menggunakan perpustakaan x/net trowing 403
PHP Editor Banana akan memperkenalkan anda kepada kaedah menggunakan perpustakaan x/net untuk melaksanakan pelayan Websocket yang menimbulkan ralat 403. Websocket ialah protokol komunikasi yang mewujudkan sambungan berterusan antara pelanggan dan pelayan, dan ralat 403 bermakna pelayan menolak permintaan pelanggan. Dengan menggunakan perpustakaan x/net, kami boleh membuat pelayan Websocket dengan mudah dan menolak permintaan dengan membuang ralat 403 apabila diperlukan. Kaedah ini mudah dan berkesan serta sesuai untuk senario di mana permintaan perlu dibenarkan atau akses terhad.
Kandungan soalan
Saya cuba melaksanakan pelayan soket web menggunakan x/net/websocket
perpustakaan standard.
Percubaan saya setakat ini adalah seperti berikut:
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() }
Cuba gunakan berbilang pelanggan ws untuk menyambung ke ws://localhost:3000/ws
时,我总是收到相同的错误:403-Forbidden
.
Saya juga mencuba contoh dari dokumentasi rasmi tetapi masih mendapatnya. Adakah saya kehilangan sesuatu yang jelas? Seperti penyekatan pelabuhan lalai atau sesuatu seperti itu?
Terima kasih terlebih dahulu.
EDIT: Anda mungkin perlu menggunakan port lain untuk menghasilkan semula isu tersebut. Menggunakan 3000
dalam contoh saya hanya akan mengganggu pelaksanaan program jika ia tidak tersedia.
Edit 2: Anda boleh menggunakan klien seperti websocat dan laksanakan websocat 'ws://localhost:3000/ws'
untuk cuba menyambung ke pelayan
Penyelesaian
Saya menyerah, tetapi mempunyai pandangan yang baik: Jika anda seperti saya dan anda mengikuti Walkthrough Anthony GG untuk Mencipta Pelayan Websocket on Go from Scratch , jangan. Video sudah lapuk, dan walaupun ia memberikan intuisi yang baik tentang cara mencipta video, adalah lebih baik (dan tidak malu) untuk belajar menggunakan perpustakaan soket web gorila.
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() }
Saya juga menggunakan gorilla/mux
untuk menggunakan parameter laluan (tidak pasti mengapa pengendali http tidak boleh).
Perhatikan cara saya menambah http.Handle
更改为 mux.Router.HandleFunc
.
Seperti yang ditunjukkan oleh pengguna @Cerise dalam ulasan, pakej x/net/websocket
包不在标准库中,但仅添加 Origin
tiada dalam pustaka standard, tetapi hanya menambah pengepala Origin
tidak menyelesaikan masalah asal sama ada.
Semoga ini dapat menyelamatkan beberapa masalah orang lain seperti saya yang ingin belajar Go.
Atas ialah kandungan terperinci Pelaksanaan pelayan websocket menggunakan perpustakaan x/net trowing 403. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Terdapat dua cara untuk mendapatkan nilai mutlak dalam C++: 1. Gunakan fungsi terbina dalam abs() untuk mendapatkan nilai mutlak jenis integer atau titik terapung 2. Gunakan fungsi generik std::abs() untuk mendapatkan pelbagai nilai mutlak yang disokong Beroperasi pada nilai mutlak jenis data.

std ialah ruang nama dalam C++ yang mengandungi komponen perpustakaan standard. Untuk menggunakan std, gunakan pernyataan "menggunakan ruang nama std;". Menggunakan simbol terus dari ruang nama std boleh memudahkan kod anda, tetapi disyorkan hanya apabila diperlukan untuk mengelakkan pencemaran ruang nama.

prime ialah kata kunci dalam C++, yang menunjukkan jenis nombor perdana, yang hanya boleh dibahagikan dengan 1 dan dirinya sendiri Ia digunakan sebagai jenis Boolean untuk menunjukkan sama ada nilai yang diberikan ialah nombor perdana, ia adalah benar, jika tidak ia palsu.

Fungsi fabs() ialah fungsi matematik dalam C++ yang mengira nilai mutlak nombor titik terapung, membuang tanda negatif dan mengembalikan nilai positif. Ia menerima parameter titik terapung dan mengembalikan nilai mutlak jenis berganda. Sebagai contoh, fabs(-5.5) mengembalikan 5.5. Fungsi ini berfungsi dengan nombor titik terapung, yang ketepatannya dipengaruhi oleh perkakasan asas.

Config mewakili maklumat konfigurasi dalam Java dan digunakan untuk melaraskan tingkah laku aplikasi Ia biasanya disimpan dalam fail luaran atau pangkalan data dan boleh diuruskan melalui Java Properties, PropertyResourceBundle, Java Configuration Framework atau pustaka pihak ketiga. kesedaran alam sekitar, kebolehurusan, skalabiliti.

Jenis kompleks digunakan untuk mewakili nombor kompleks dalam bahasa C, termasuk bahagian nyata dan khayalan. Bentuk permulaannya ialah complex_number = 3.14 + 2.71i, bahagian sebenar boleh diakses melalui kreal(complex_number), dan bahagian khayalan boleh diakses melalui cimag(complex_number). Jenis ini menyokong operasi matematik biasa seperti penambahan, penolakan, pendaraban, pembahagian dan modulo. Di samping itu, satu set fungsi untuk bekerja dengan nombor kompleks disediakan, seperti cpow, csqrt, cexp dan csin.

Fungsi min dalam C++ mengembalikan minimum berbilang nilai. Sintaksnya ialah: min(a, b), dengan a dan b ialah nilai yang hendak dibandingkan. Anda juga boleh menentukan fungsi perbandingan untuk menyokong jenis yang tidak menyokong operator <. C++20 memperkenalkan fungsi std::clamp, yang mengendalikan minimum tiga atau lebih nilai.

Terdapat tiga cara untuk mencari nilai mutlak dalam C++: Menggunakan fungsi abs(), anda boleh mengira nilai mutlak sebarang jenis nombor. Menggunakan fungsi std::abs(), anda boleh mengira nilai mutlak integer, nombor titik terapung dan nombor kompleks. Pengiraan manual nilai mutlak, sesuai untuk integer mudah.
