为什么 Socket.IO 可以让 WebSockets 和 HTTP 监听在同一端口?


按 TCP 或者 HTTP, 两个服务监听同一端口是会报错的,
但 Socket.IO 却可以直接监听 Express 服务器的同一端口,
具体原因是什么?

WebSockets 是基于 HTTP 实现, 是否相关?

websocket 网络 Express node.js

幻想と真実と 11 years, 5 months ago

应该是两个程序监听一个端口会报错。

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请求。

好地地唔得嘅 answered 11 years, 5 months ago

Your Answer