我目前正在尝试开发一个与 node.js 服务器对话的简单 Flash 游戏。
我的问题是:我该如何制作一个服务器来区分网络请求和游戏请求?
以下是我所做的详细信息:
以前,我使用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对象,因此我不能期望从/向正确的套接字读取或写入。相反,我将读取/写入与网页请求关联的套接字。
对此的任何帮助将不胜感激(特别是如果我以错误的方式推理)。