我目前正在嘗試開發一個與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