我正在尝试使用 node.js 中的服务器端逻辑在 html5 中进行游戏,并使用原始 websockets(不是 Socket.IO,我需要二进制数据)。我希望有多个“房间”,因此有多个 websocket 服务器,它们都有单独的 URL。目前,我只找到了一种将每个 websocket 服务器连接到特定端口的方法,然后根据 url 将升级请求(不完全确定它是如何工作的)代理到正确的端口。
它适用于我的电脑。问题是当我尝试将其提交给 PaaS 提供商 (AppFog) 时,代码会失败,因为它们不允许打开除提供的 http 端口之外的任何端口。
这是我的代码的一个非常清晰的版本:
//start web server (basic static express server) on 8080
// ...
//start game server and listen to port 9000
// I use the ws module for websockets
// I plan to have a couple of these "game servers"
// ...
//open the proxy server.
var httpProxy= require('http-proxy');
var webProxyServer = httpProxy.createServer(function (req, res, proxy){
// I need http requests to be redirected to the "game servers"
if(req.url.substring(0, "/room1".length) === "/room1") // if starts with "/room1"
proxy.proxyRequest(req, res, {
host: 'localhost',
port: 9000
});
else
proxy.proxyRequest(req, res, {
host: 'localhost',
port: 8080
});
}
webProxyServer.on('upgrade', function (req, socket, head) {
//redirecting logic goes here
if(req.url=="/room1/"){
webProxyServer.proxy.proxyWebSocketRequest(req, socket, head, {
host: 'localhost',
port: 9000
})
}
});
webProxyServer.listen(8000); //the "outside port".
我的问题:是否有可能在不监听任何特定端口的情况下打开 websocket 服务器,并手动将套接字附加到它们,这样我就不需要打开基本 http 端口以外的任何端口?我知道 Socket.IO 以某种方式做到了。也许有一种方法可以监听 http 服务器的升级事件并将套接字传递给正确的 websocket 服务器?
我对服务器端的东西很陌生,所以欢迎在这里和那里提供额外的信息。