Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk melaksanakan http.Hijacker menggunakan Gorilla Websockets dan alexedwards/scs/v2
Editor PHP Apple hari ini memperkenalkan kepada anda kaedah untuk melaksanakan http.Hijacker menggunakan Gorilla Websockets dan perpustakaan alexedwards/scs/v2. Kaedah ini boleh membantu pembangun melaksanakan fungsi komunikasi masa nyata dalam aplikasi mereka sendiri, sama ada ruang sembang atau kemas kini masa nyata, dsb., boleh dilaksanakan dengan cara ini. Seterusnya, kami akan menerangkan secara terperinci cara menggunakan kedua-dua perpustakaan ini untuk melaksanakan http.Hijacker untuk menjadikan aplikasi anda lebih berkuasa dan fleksibel.
Alexedwards/scs/v2 yang sangat baik dalam aplikasi web Go baru-baru ini dinaik taraf daripada 2.5.0 kepada 2.7.0 untuk membolehkan Go 1.20+ menyokong http.NewResponseController(). Selepas itu benarkan tamat masa tulis pelayan khusus pengendali sambungan untuk muat naik fail yang besar. Ini bagus. Akibat malang daripada peningkatan yang diperlukan ini ialah kehilangan kefungsian soket web, pada masa ini menggunakan soket web Gorilla v1.5.1 (terkini). Saya mendapat ralat biasa apabila cuba menyambung untuk menaik taraf... soket web: respons tidak dilaksanakan http.Hijacker Saya telah meneliti beberapa utas untuk ini, beberapa daripadanya di SO, tetapi saya tidak dapat menyelesaikan apa-apa yang khusus untuk kes ini. Saya telah mencuba beberapa perkara untuk mencuba dan melaksanakan http.Hijacker dalam pengendali titik akhir soket web saya bersama-sama dengan kod perisian tengah saya yang lain (diulas, dilampirkan contoh "mengelirukan" untuk ilustrasi)... Saya cuma rasa saya faham ini Tidak cukup baik. ..
type WebsocketConnection struct { *websocket.Conn } type WebsocketPayload struct { Action string `json:"action"` Message string `json:"message"` AdminName string `json:"admin_name"` MessageType string `json:"message_type"` AdminID int `json:"admin_id"` Connection WebsocketConnection `json:"-"` } type WebsocketJSONResponse struct { Action string `json:"action"` Message string `json:"message"` AdminName string `json:"admin_name"` AdminID int `json:"admin_id"` CurrentLogins []string `json:"current_logins"` } var upgradeConnection = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, CheckOrigin: func(r *http.Request) bool { return true }, } var webClients = make(map[WebsocketConnection]string) var websocketChannel = make(chan WebsocketPayload) func (app *application) WebsocketEndPoint(w http.ResponseWriter, r *http.Request) { // rc := http.NewResponseController(w) // netConn, _, err := rc.Hijack() // if err != nil { // app.errorLog.Println(err) // return // } // defer netConn.Close() app.debugLog.Printf("w's type is %T\n", w) ws, err := upgradeConnection.Upgrade(w, r, nil) if err != nil { app.errorLog.Println(err) <= ERROR HERE return } app.infoLog.Printf("Web client connected from %s", r.RemoteAddr) var response WebsocketJSONResponse response.Message = "Connected to server..." err = ws.WriteJSON(response) if err != nil { app.errorLog.Println(err) return } conn := WebsocketConnection{Conn: ws} webClients[conn] = "" go app.ListenForWebsocket(&conn) }
"w" dalam contoh ini ialah *scs.sessionResponseWriter. Bagaimanakah saya boleh melaksanakan http.Hijacker dalam respons tanpa memutuskan sambungan dan menaik taraf? Apakah pendekatan yang betul?
pakej alexedwards/scs/v2 versi 2.5.0 menyokong antara muka perampas. Versi 2.7.0 tidak menyokong antara muka Hijacker, tetapi menyokong menyokong pengawal tindak balas. Pakej soket web gorila tidak menggunakan pengawal tindak balas.
Pilihan 1
Menggunakan 2.5.0 pakej alexedwards/scs/v2.
Pilihan 2
Betulkan kecacatan pakej gorila dengan membongkar penulis respons dalam kod aplikasi anda:
func (app *application) WebsocketEndPoint(w http.ResponseWriter, r *http.Request) { wupgrade := w if u, ok := w.(interface{ Unwrap() http.ResponseWriter }); ok { wupgrade = u.Unwrap() } app.debugLog.Printf("w's type is %T\n", w) ws, err := upgradeConnection.Upgrade(wupgrade, r, nil) if err != nil { app.errorLog.Println(err) return } app.infoLog.Printf("Web client connected from %s", r.RemoteAddr) var response WebsocketJSONResponse response.Message = "Connected to server..." err = ws.WriteJSON(response) if err != nil { app.errorLog.Println(err) return } conn := WebsocketConnection{Conn: ws} webClients[conn] = "" go app.ListenForWebsocket(&conn) }
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan http.Hijacker menggunakan Gorilla Websockets dan alexedwards/scs/v2. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!