我目前正在尝试开发一个与node.js服务器交谈的简单Flash游戏。使用ExpressJS的游戏+ Web服务器
我的问题是这样的: 我该如何做一个服务器来区分Web请求和游戏请求?
下面是我所做的一切细节:
以前,我用了net
和static
模块来处理分别从游戏客户端和浏览器的请求。
TwoServers.js
// Web server
var file = new staticModule.Server('./public');
http.createServer(function(req, res){
req.addListener('end', function(){
file.serve(req, res, function(err, result){
// do something
});
});
}).listen(port1, "127.0.0.1");
// Game Server
var server = net.createServer(function(socket)
{
// handle messages to/from Flash client
socket.setEncoding('utf8');
socket.write('foo');
socket.on('data', onMessageReceived);
});
server.listen(port2, "127.0.0.1");
我想做到以上只是一个Express服务器在一个端口上监听,但我不知道如何去这样做。
这里就是我想它可能看起来像(实际上不工作):
OneServer.js
var app = express();
app.configure(function()
{
// ...
app.use('/',express.static(path.join(__dirname, 'public'))); // The static server
});
app.get('/', function(req, res) // This is incorrect (expects http requests)
{
// Handle messages to/from Flash client
var socket = req.connection;
socket.setEncoding('utf8');
socket.write('foo');
socket.on('data', onMessageReceived);
});
app.listen(app.get('port')); // Listen in on a single port
但我希望能够从网页请求分化和游戏的要求。
注:可使用ActionScript的XMLSocket使TCP请求,因此使用app.get( '/')是不正确的原因有两个:
当Flash写入到插座,不使用http协议,所以当游戏尝试连接时app.get('/')不会被触发。
因为我无权修改net.Socket对象,所以我不能指望从/正确读取或写入正确的套接字。相反,我将读/写与网页请求关联的套接字。
对此的任何帮助将非常感激(特别是如果我推断这是错误的方式)。
感谢您的回答,这是有道理的。我可能不得不使用AS3 [套接字](http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/Socket.html)类来定制标头,如果我要走这条路。虽然使用express/http模块的多个端口以及网络模块会被认为是不好的做法? – funseiki
这取决于您是否确定某些用户无法使用您的游戏。许多网络环境(公司网络,公共WiFi,终端用户的偏执防火墙等)阻止外出连接到除端口80之外的任何内容,因此用户将能够加载您的网站和swf,但是然后游戏将无法通过* n *端口连接到您的服务器。通过进行HTTP升级,您知道如果用户可以访问您的网站,游戏也可以连接。 – josh3736
因为我在Heroku上托管,所以似乎我无法在多个端口上托管。所以我认为你是对的,而且这种方法可能是最好的选择。 – funseiki