NodeJS + Socket.IO + Websocket + Flash - перенести проект на хостинг - PullRequest
0 голосов
/ 27 декабря 2011

Я создал простой проект игры в реальном времени, используя NodeJS + Socket.IO + Websocket + Flash. Все отлично работает на моем ПК (localhost). Временно разместите проект на бесплатном хостинге cloudno.de. Не работал.

Я использую эти файлы: 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: 8275" и будет изменен перед переносом на хостинг

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

Журнал консоли хостинга:

27 дек. 09:19:49 - Завернутый скрипт Cloudnode запускается (30128) в вторник 27 декабря 2011 г. 09:19:49 GMT + 0100 (UTC) [36minfo - [39m socket.io запущен 27 декабря 09:19:49 - [INFO] Cloudnode прослушивает порт: 8275 Прослушивание чата по порту 8275 .. Перейдите на http://:8275 НАЧНИТЕ НАЧНИТЕ НАЧНИТЕ НАЧНИТЕ [90mdebug - [39m обслуживаемый статический контент /socket.io.js НАЧНИТЕ НАЧНИТЕ [90mdebug - [39m клиент авторизован [36минфо - [39м рукопожатие разрешено 1357476841432378537

Журнал консоли Localhost:

C: \ inetpub \ wwwroot \ 14l> узел server.js информация - socket.io запущен Прослушивание чата через порт 8275 .. Перейдите на http://:8275 НАЧНИТЕ отладка - обслуживаемый статический контент /socket.io.js НАЧНИТЕ НАЧНИТЕ НАЧНИТЕ отладка - клиент авторизован информация - рукопожатие разрешено 3511308552126147045 отладка - запрос установки GET /socket.io/1/flashsocket/3511308552126147045 debug - установить интервал пульса для клиента 3511308552126147045 debug - клиент авторизован для отладка - запись на flashsocket 1 :: CONNECTED

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

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

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

1 Ответ

3 голосов
/ 27 декабря 2011

Алессиоалекс как бы прибил его. Ваш код на стороне клиента не использует 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

Надеюсь, что все это немного помогает, счастливое кодирование!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...