2011-12-27 43 views
0

我使用NodeJS + Socket.IO + Websocket + Flash創建了一個簡單的實時遊戲項目。一切工作正常我的電腦(本地主機)。 暫時將項目放置在免費託管cloudno.de上。不工作。NodeJS + Socket.IO + Websocket + Flash - 將項目轉移到主機

我使用這些文件: server.js - 文件服務器的NodeJS(該文件沒有改變託管,因爲這個端口(8275)被提名主辦我的應用程序):

var io = require('socket.io'), 
    http = require('http'); 

var fs = require('fs'), 
    util = require('util'); 

var url = require('url'), 
    path = require('path'), 
    mime = require('mime'); 

function findType(uri) { 
    var ext = uri.match(/\.\w+$/gi); 
    if (ext && ext.length > 0) { 
    ext = ext[0].split(".")[1].toLowerCase(); 
    return mime.lookup(ext); 
    } 
    return undefined; 
} 

function sendError(code, response) { 
    response.writeHead(code); 
    response.end(); 
    return; 
} 

    var app = http.createServer(function(request, response) { 
     var uri = url.parse(request.url).pathname; 
     if (uri === '/') { 
     uri = '/index.html'; 
     } else if (uri === '/server.js') { 
     sendError(404, response); 
     return; 
     } 
     var _file = path.join(process.cwd(), uri); 

     path.exists(_file, function(exists) { 
     if (!exists) { 
      sendError(404, response); 
     } else { 
      fs.stat(_file, function(err, stat) { 
      var file = __dirname + uri, 
       type = findType(uri), 
       size = stat.size; 
      if (!type) { 
       sendError(500, response); 
      } 
      response.writeHead(200, {'Content-Type':type + "; charset=utf-8", 'Content-Length':size}); 
      console.log("START"); 
      var rs = fs.createReadStream(file); 
      util.pump(rs, response, function(err) { 
       if (err) { 
       console.log("ReadStream, WriteStream error for util.pump"); 
       response.end(); 
       } 
      }); 
      }); 
     } 
     }); 

    }); 

var socket = io.listen(app, {transports:['websocket', 'flashsocket', 'xhr-polling']}), 
    buffer = [], 
    MAXBUF = 1024, 
    json = JSON.stringify; 

var clients = []; 
clients.usernames = function(client) { 
    return client.username; 
} 

socket.sockets.on('connection', function(client) { 
console.log("CONNECTED"); 
    client.on('message', function(data) { 
     //skipped more line of code 

    client.on('disconnect', function() { 
    if (client.username) { 
     client.json.broadcast.send({announcement:(client.username)+' left game', id:(client.id)}); 
    } 
    var pos = clients.indexOf(client); 
    if (pos >= 0) { 
     clients.splice(pos, 1); 
    } 
    });}); 

if (!module.parent) { 
    app.listen(8275); 
    console.log("Socket-Chat listening on port 8275.. Go to http://<this-host>:8275"); 
} 

的index.html - 客戶端文件。以下是一些連接Websocket的代碼。

<script src="/socket.io/socket.io.js" charset="utf-8"></script> 
     <script type="text/javascript" src="web_socket.js" charset="utf-8"></script> 

    <script type="text/javascript" charset="utf-8"> 

    // Set URL of your WebSocketMain.swf here: 
    WEB_SOCKET_SWF_LOCATION = "WebSocketMain.swf"; 
    // Set this to dump debug message from Flash to console.log: 
    WEB_SOCKET_DEBUG = true; 

    // Everything below is the same as using standard WebSocket. 
    var ws; 

    function init() { 
     // Connect to Web Socket. 
     // Change host/port here to your own Web Socket server. 
     ws = new WebSocket("ws://myapp.cloudno.de");//on localhost i use "localhost:8275" and will be change before transfer 
     // Set event handlers. 
     ws.onopen = function() { 
     output("onopen"); 
     }; 
     ws.onmessage = function(e) { 
     // e.data contains received string. 
     output("onmessage: " + e.data); 
     }; 
     ws.onclose = function() { 
     output("onclose"); 
     }; 
     ws.onerror = function() { 
     output("onerror"); 
     }; 

    } 

    function onSubmit() { 
     var input = document.getElementById("input"); 
     // You can send message to the Web Socket using ws.send. 
     ws.send(input.value); 
     output("send: " + input.value); 
     input.value = ""; 
     input.focus(); 
    } 

    function onCloseClick() { 
     ws.close(); 
    } 

    function output(str) { 
     var log = document.getElementById("log"); 
     var escaped = str.replace(/&/, "&amp;").replace(/</, "&lt;"). 
     replace(/>/, "&gt;").replace(/"/, "&quot;"); // " 
     log.innerHTML = escaped + "<br>" + log.innerHTML; 
    } 

    </script> 

web_socket.js - 劇本並沒有改變,並從項目完全採取:https://github.com/gimite/web-socket-js

WebSocketMain.swf - 這個文件沒有改變,也從https://github.com/gimite/web-socket-js

SocketGame.swf - 這是我的遊戲的主要文件,從這個例子https://github.com/simb/FlashSocket.IO。這改變了只有一行: 插座=新FlashSocket(「myapp.cloudno.de」); // localhost上我使用「localhost:8275」,並會轉移到託管

能否請你告訴以前是否改變我已更改託管的配置?作爲參考,服務器記錄託管和本地主機。這種差異立即顯而易見,但尚不清楚爲什麼會發生這種情況。

主機控制檯日誌:

12月27日9時19分49秒 - Cloudnode在週二開始包裹腳本(30128)2011年12月27日9時19分49秒GMT + 0100(UTC) [36minfo - [39米插座.IO開始 12月27日9點19分49秒 - [INFO] Cloudnode偵聽端口:8275 插座聊天偵聽端口8275 ..訪問http://:8275 START START START START [90mdebug - [39m送達靜態內容/socket.io.js START START [90mdebug - [39m客戶端授權 [36minfo - [39米握手授權1357476841432378537

本地主機控制檯日誌:

C:\的Inetpub \ wwwroot的\14升>節點server.js 信息 - socket.io開始在端口8275 插座聊天聆聽。 。訪問http://:8275 START 調試 - 提供靜態內容/socket.io.js START START START 調試 - 客戶端授權 信息 - 握手授權3511308552126147045 調試 - 設置請求GET /socket.io/1/flashsocket/3511308552126147045 0授權 調試客戶端 - -調試 - 爲客戶3511308552126147045 調試設置心跳間隔flashsocket寫1 :: 連

開始我的應用程序後出現的握手和一切都停止了 - 連接失敗。我改變了很多選擇 - 沒有任何幫助。

我懷疑這個問題或套接字。io(但我簡單地複製了使用我的電腦的模塊)或Flash安全策略。但如何在我的具體情況下使用它並不清楚。 下面是應該幫助的模塊(https://github.com/3rd-Eden/FlashPolicyFileServer),但是如何將它集成到我的項目中?

我將非常感謝澄清。

+0

爲什麼不在前端使用Socket.IO,而是使用基本的WS? (這將只在Chrome中工作,也許另一個1-2瀏覽器取決於設置) – alessioalex 2011-12-27 17:07:33

+0

因爲我不知道任何其他方式從Flash客戶端中的JS(Socket.IO客戶端)數據傳遞(移動英雄,怪物,子彈)來自另一個Flash。 P2P容易造假。 – Astraport 2011-12-27 19:14:04

+0

如果你想使用Flash環境下的WebSocket,[Kaazing](http://kaazing.com)對它有廣泛的支持。免責聲明:我爲Kaazing工作。 – 2011-12-28 09:02:20

回答

3

Alessioalex類釘它。你的客戶端代碼沒有利用socket.io來做你想要做的flash socket/xhr的工作。你真的想在客戶端上使用socket.io:

http://socket.io/#how-to-use

你可能碰到的另一個問題是缺乏對你的主機上的WebSockets支持。目前的Heroku從此受到影響,他們建議只是XHR滾動:

http://devcenter.heroku.com/articles/using-socket-io-with-node-js-on-heroku

的FlashSocketPolicy整合應該是很容易的。你只需要npm安裝模塊,將它導入到app.js中,然後開始監聽。在github上回購的例子是非常簡單的:

https://github.com/3rd-Eden/FlashPolicyFileServer/blob/master/examples/basic.js

希望這一切都有助於一點,編碼快樂!

+0

謝謝Justin。我已經瞭解了所有nodejs指令很多天的情況,但是它並沒有幫助,因爲很難學習服務器端腳本,什麼時候是Flash開發人員。我找到了這個例子(https://github.com/simb/FlashSocket.IO)並進行了聊天,有一天我創建了一個實時多人遊戲,並且在我的電腦上運行良好,但是轉移到託管時出現問題。由於託管是免費的(我不想購買沒有前景的nodejs託管),因此沒有技術支持。 – Astraport 2011-12-27 19:09:02

+0

我試過FlashPolicyFileServer,但它導致錯誤(TypeError:Object [object Object]沒有方法'listen')到pf.listen();行。我也試過這個解決方案https://github.com/freeformsystems/node-fxs。也沒有結果,無論是錯誤還是許可被拒絕。也許這是免費託管的某種限制。至於Websockets的拒絕,我使用Flash,並且不知道其他方式從其他Flash中的JS(Socket.IO客戶端)數據傳遞給Flash客戶端(移動英雄,怪物,子彈)。 – Astraport 2011-12-27 19:12:33

+1

呵呵,Flash政策模塊不起作用是件可悲的事 - 過去我不得不做一些瘋狂的事情,當我看到有人爲它製作了一個模塊時,我感到非常興奮。至於從JS傳遞數據到Flash - 這是一個簡單的部分:-)您使用ExternalInterface:http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf626ae-7fe8.html#WS2db454920e96a9e51e63e3d11c0bf69084-7f31 – 2011-12-27 19:20:23