WebSocket 连接到“ws://localhost:8080/”失败:WebSocket 握手期间出错:意外响应代码:404

Posted

技术标签:

【中文标题】WebSocket 连接到“ws://localhost:8080/”失败:WebSocket 握手期间出错:意外响应代码:404【英文标题】:WebSocket connection to 'ws://localhost:8080/' failed: Error during WebSocket handshake: Unexpected response code: 404 【发布时间】:2020-12-14 19:16:05 【问题描述】:

到 'ws://localhost:8080/websocket' 的 WebSocket 连接失败:WebSocket 握手期间出错:意外响应代码:404,当我尝试将 Websocket 从 ReactJS 连接到我创建了一个后端(Go)时会发生这种情况处理程序,这是我的后端代码路由器文件

import (
    "net/http"

    "../server"
    "github.com/gorilla/mux"
)

// Router is exported and used in main.go
func Router() *mux.Router 

    router := mux.NewRouter().StrictSlash(true)
    router.HandleFunc("/ws", server.HandleConnections) //
    router.HandleFunc("/api/block", server.GetAllBlock).Methods("GET", "OPTIONS")
    router.HandleFunc("/api/block", server.CreateBlock).Methods("POST", "OPTIONS")

    router.PathPrefix("/").Handler(http.FileServer(http.Dir("../public")))

    return router

这是我的主线

func runWebServer() 
    r := router.Router()


    fmt.Println("Starting server on the port 8080...")
    log.Fatal(http.ListenAndServe("localhost:8080", r))


func main() 
     go runWebServer()

这是我的handleConnection函数

func HandleConnections(w http.ResponseWriter, r *http.Request) 
    fmt.Println("In handle")

    ws, err := upgrader.Upgrade(w, r, nil)
    if err != nil 
        log.Fatal(err)
        fmt.Println("Error in ebss")
    
    fmt.Println("No error")
    // make sure we close the connection when the function returns
    //  defer ws.Close()

    // register our new client
    nodes[ws] = true

    for 
        // Read in a new message as JSON and map it to a Message object
        var course Course
        err := ws.ReadJSON(&course)
        if err != nil 
            log.Printf("error: %v", err)
            //  delete(nodes, ws)
            break
        

        // Send the newly received message to the broadcast channel
        broadcast <- course
    


这是我发生 404 握手错误的前端 React 文件

let endpoint = "http://localhost:8080";

    class Blockchain extends Component 
      componentDidMount() 
        let ws = new WebSocket('ws://localhost:8080');//Here
        console.log("webs",ws)
      

This is the error shown in browser when loading the page

【问题讨论】:

我假设你想要ws://localhost:8080/ws,因为那是你的服务器所拥有的 我的错,谢谢解决了 【参考方案1】:

这是您的主要问题:

func main() 
     go runWebServer()

这会在一个单独的 goroutine 中运行 runWebServer 函数,这使得主 goroutine,main() 函数调用,继续超过该行。由于您的main 函数中没有更多指令,因此程序返回。当一个 Go 程序返回时,所有子 goroutines 都会返回。由于main goroutine 返回太快,因此无法依赖此程序执行任何操作。

您应该像下面这样以阻塞方式运行该函数,或者查看管理多个 goroutines。 This guide 可能是一个不错的起点。

func main() 
     runWebServer()

【讨论】:

以上是关于WebSocket 连接到“ws://localhost:8080/”失败:WebSocket 握手期间出错:意外响应代码:404的主要内容,如果未能解决你的问题,请参考以下文章

无法连接到 websocket

内容安全策略拒绝连接到 Websocket 错误

actioncable 无法连接到 websocket

WebSocket 连接到自签名服务器

WCF 连接到 Websocket 服务器

在android java中连接到服务器websocket