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的主要内容,如果未能解决你的问题,请参考以下文章