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