2011-12-27 3 views
0

Я создал простой проект игры в реальном времени, используя NodeJS + Socket.IO + Websocket + Flash. Все работает нормально на моем ПК (localhost). Временно поместите проект на бесплатный хостинг 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. Это изменило только одну строку: socket = new FlashSocket («myapp.cloudno.de»); // на localhost я использую «localhost: 8275» и будет изменен до передачи на хостинг

Можете ли вы рассказать, Я изменил конфигурацию для хостинга? Для справки, сервер регистрируется для хостинга и для localhost. Разница заметна сразу, но неясно, почему это происходит.

Хостинг журнала консоли:

27 декабря 9:19:49 - Cloudnode обернут скрипт начальной (30128) в Втр 27 декабря 2011 9:19:49 GMT + 0100 (UTC) [36minfo - [39m гнездо .io начал 27 декабря 9:19:49 - [INFO] Cloudnode прослушивает порт: 8275 Socket-чат на порту 8275 .. Перейти к HTTP: //: 8275 START START START START [90mdebug - [39 м служил статическим контентом /socket.io.js START START [90mdebug - [39m клиент разрешен [36minfo - [39m рукопожатие уполномочило 1357476841432378537

Localhost консоль журнал:

C: \ Inetpub \ Wwwroot \ 14L> узел server.js информации - socket.io начал Socket-чат на порт 8275. . Перейти к HTTP: //: 8275 START отладки - служил статического контента /socket.io.js START START START отладки - клиент уполномочил информация - рукопожатие уполномоченный 3511308552126147045 отладки - установка запроса GET /socket.io/1/flashsocket/3511308552126147045 отладка - установить интервала подтверждения для клиента 3511308552126147045 отладки - клиент уполномоченного для отладки - flashsocket написание 1 :: СВЯЗАННЫХ

После запуска моего приложения происходит рукопожатие и все остановилось - не удается установить соединение. Я изменил много вариантов - ничего не помогает.

Я подозреваю, что проблема или розетка.io (но я просто скопировал модуль, работающий с моим компьютером) или политику безопасности Flash. Но как использовать его в моем конкретном случае неясно. Вот модуль, который должен помочь (https://github.com/3rd-Eden/FlashPolicyFileServer), но как его интегрировать в мой проект?

Буду признателен за разъяснения.

+0

Почему вы не используете Socket.IO на интерфейсе, но вместо этого используете базовый WS? (который будет работать только в Chrome и, возможно, в других браузерах в зависимости от настроек) – alessioalex

+0

Поскольку я не знаю других способов передачи данных JS (Socket.IO) в клиенте Flash (перемещение героя, монстров, маркеров) из другой Flash. P2P легко подделать. – Astraport

+0

Если вы хотите использовать WebSockets из среды Flash, у нее есть обширная поддержка [Kaazing] (http://kaazing.com). Отказ от ответственности: я работаю на Kaazing. –

ответ

3

Alessioalex вид гвоздя его. Ваш код на стороне клиента не использует socket.io для создания флеш-сокета/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

Спасибо, Джастин. Я должен знать со всеми инструкциями nodejs много дней, но это не помогает, потому что сложно освоить серверные скрипты, когда это разработчик флеш-памяти. Я нашел этот пример (https://github.com/simb/FlashSocket.IO) и сделал чат, однажды я создал многопользовательскую игру в режиме реального времени, и он отлично работал на моем компьютере, но были проблемы с передачей на хостинг , Поскольку хостинг бесплатный (я не хочу покупать хостинг nodejs без каких-либо перспектив), тогда нет технической поддержки. – Astraport

+0

Я пробовал FlashPolicyFileServer, но вызывает ошибку (TypeError: Object [object Object] не имеет метода 'listen') к строке pf.listen(); Я также пробовал это решение https://github.com/freeformsystems/node-fxs. Также нет результата, либо ошибка, либо разрешение отклонено. Возможно, это какое-то ограничение бесплатного хостинга. Что касается отказа от Websockets, я использую Flash и не знаю других способов передать данные JS (Socket.IO client) в клиенте Flash (перемещение героя, монстров, маркеров) из другой Flash. – Astraport

+1

Да, грустно, что модуль флеш-политики не работает - мне приходилось делать какие-то сумасшедшие вещи, чтобы обойти это в прошлом, и был взволнован, когда я увидел, что кто-то создал для него модуль. Что касается передачи данных от JS к Flash - это легкая часть :-) Вы используете ExternalInterface: http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf626ae-7fe8.html#WS2db454920e96a9e51e63e3d11c0bf69084-7f31 ​​ –