如何使用 socket.io 库区分客户端 TCP 套接字和客户端 websocket?

How to differentiate client TCP socket and client websocket using socket.io library?

如何处理来自相同端口的客户端 TCP 套接字和客户端 Websocket 的请求?

这需要一些创造性的工作,因为您必须等到第一个数据到达新连接的套接字才能辨别它必须是什么类型的连接。两者都以传入的 TCP 连接开始。

然后,webSocket 连接会在初始 TCP 连接之后发送一个 http 请求,请求将协议升级到 webSocket 协议。您可以检查到达新连接的 TCP 套接字的第一个数据,并检查套接字上的第一个数据是否确实是该格式的 http 请求。如果是,那么它是一个传入的 webSocket 连接。

如果不是,那么它一定是您的常规 TCP 连接。在任何一种情况下,一旦您确定了它必须是哪种类型的连接,您就会将初始数据传递给该类型连接的适当处理程序,以便它可以接管该套接字的处理。

一个有点相似的模型被用来允许一个http服务器和一个webSocket服务器共享同一个端口。这对他们来说更容易一些,因为这两种协议都以 http 请求开头,但想法是相同的,因为当一个 webSocket 服务器共享一个 http 服务器时,它会检查传入的请求,看看它是否看起来像是一个 webSocket 连接的开始(带有 upgrade header 的 http 请求)。如果是,它将请求传递给 webSocket 处理代码。如果不是,它会将其视为正常传入的 http 请求并将其传递给 http 请求处理代码。

您可以在此处查看初始 webSocket 连接的外观:How does WebSockets server architecture work? and here: node js net sockets + websocket without socket.io。两者都会向您展示启动所有 webSocket 连接的初始 http 请求的形式。