按 TCP 或者 HTTP, 两个服务监听同一端口是会报错的, 但 Socket.IO 却可以直接监听 Express 服务器的同一端口, 具体原因是什么?
WebSockets 是基于 HTTP 实现, 是否相关?
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
應該是兩個程序監聽一個端口會報錯。
websocket, http 都是基於tcp實現的。websocket 的連接請求都是用的http。websocket和http是在一個層麵上的東西。比如在Go中處理websocket請求:
路由:
http.HandleFunc("/ws", serveWs)
處理action:
func serveWs(w http.ResponseWriter, r *http.Request) { if r.Method != "GET" { http.Error(w, "Method not allowed", 405) return } if r.Header.Get("Origin") != "http://"+r.Host { http.Error(w, "Origin not allowed", 403) return } ws, err := websocket.Upgrade(w, r, nil, 1024, 1024) if _, ok := err.(websocket.HandshakeError); ok { http.Error(w, "Not a websocket handshake", 400) return } else if err != nil { log.Println(err) return } c := &connection{send: make(chan []byte, 256), ws: ws} h.register <- c c.writePump() h.unregister <- c }
和普通的http請求處理很類似,也是使用GET方法,Node的原理也是一樣的。
另外一個端口可以接受多個tcp請求。
因為 WebSocket 是基於 HTTP 1.1 的一個功能,它本身是依賴 HTTP 的(使用 101 狀態碼來切換協議)。Express 應該知道自己已經監聽了那個端口,所以沒有再嚐試監聽(bind(2)),而隻是給那個端口來的請求注冊了針對 HTTP WebSocket 請求的處理方法。
按理說TCP與HTTP之間是不能用「或者」的。 在OSI模型中,TCP是第四層傳輸層的協議,HTTP是第七層應用層的協議。
你的問題可以這樣理解,socket.io 和 Express 都在使用node正在監聽的端口來分別處理請求,而不是分別監聽端口。
應該是兩個程序監聽一個端口會報錯。
websocket, http 都是基於tcp實現的。websocket 的連接請求都是用的http。websocket和http是在一個層麵上的東西。比如在Go中處理websocket請求:
路由:
處理action:
和普通的http請求處理很類似,也是使用GET方法,Node的原理也是一樣的。
另外一個端口可以接受多個tcp請求。
因為 WebSocket 是基於 HTTP 1.1 的一個功能,它本身是依賴 HTTP 的(使用 101 狀態碼來切換協議)。Express 應該知道自己已經監聽了那個端口,所以沒有再嚐試監聽(bind(2)),而隻是給那個端口來的請求注冊了針對 HTTP WebSocket 請求的處理方法。
按理說TCP與HTTP之間是不能用「或者」的。
在OSI模型中,TCP是第四層傳輸層的協議,HTTP是第七層應用層的協議。
你的問題可以這樣理解,socket.io 和 Express 都在使用node正在監聽的端口來分別處理請求,而不是分別監聽端口。