我正在使用node.js的快速框架创建一个应用程序,该框架通过http提供html内容并使用websockets进行聊天功能。我想知道如何在同一时间完成这两项工作。我的想法是为websocket连接使用不同的端口(因此http请求将到达端口3000并且websockets将在端口3001上连接)但我不知道这是否是一个很好的解决方案。我特别担心像heroku这样的部署,如果我可以为我的应用程序指定不同的端口。
答案 0 :(得分:3)
我想知道如何在同一时间完成这两项工作。
webSocket协议是专门设计的,因此它可以在常规Web服务器请求的同一端口上运行。因此,您不需要单独的端口,以便同时使用webSockets运行Web服务器和聊天。
这是有效的,因为始终使用设置一些特殊标头的http请求启动webSocket连接。接收Web服务器然后可以检测那些特殊标头,并且知道该传入的http请求实际上是发起webSocket连接的请求。通过特定响应,客户端和服务器然后同意“升级”连接并切换到webSocket协议。从那时起,该特定TCP连接使用webSocket协议。
同时,任何没有特殊webSocket标头的传入http请求都会被您的Web服务器视为常规的http请求。通过这种方式,同一服务器和相同的端口可用于webSocket连接和常规http请求。不需要第二个端口。
此方案的另一个优点是客户端可以避免在尝试使用与加载的网页不同的端口时遇到的跨源问题。
我特别担心部署到heroku和 如果我可以为我的应用程序指定不同的端口。
如果你实际使用两个端口,那么你需要创建两个独立的服务器,一个监听每个端口,因为给定的服务器只能监听一个端口。在node.js中,两个服务器都可以位于同一个node.js应用程序中(这样可以更容易地在它们之间共享数据),或者您可以将它们放在完全独立的node.js进程中(您的选择)。
而且,如果您使用多个端口,则还必须支持CORS,以便允许浏览器连接到单独的端口(以避免同源限制)。