Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.12.2011, 19:31
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 1  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
По умолчанию Node.js + Websockets + Flash

Кому либо приходилось работать с этими технологиями (одновременно)?

Третий день бьюсь: на локалхосте все отлично - на хостинге какие-то проблемы. Подозреваю что проблема в Websocket, а вернее в Flash socket policy file.

Как здесь пишут: If you are NOT using web-socket-ruby or em-websocket as your WebSocket server, you need to place Flash socket policy file on your server. See "Flash socket policy file" section below for details.

Думал, что это обычный crossdomain.xml, но похоже все намного сложнее. Этот модуль какой-то бредовый, вызывает ошибки.

Как мне вообще можно на одном хостинге слушать сразу два порта?

Старый 27.12.2011, 23:03
_SoWa вне форума Посмотреть профиль Отправить личное сообщение для _SoWa Найти все сообщения от _SoWa
  № 2  
Ответить с цитированием
_SoWa
 
Аватар для _SoWa

Регистрация: Oct 2009
Сообщений: 72
Такая же проблема. Косяк в политике безопасности. Если вывод в консоль на сервере поставить, можно увидеть, что приходит запрос файла политики безопасности. Мне бы попроще совет - как локально поотлаживать эту политику безопасности....
Я пытаюсь пока решить эту проблему по аналогии со своим прошлым опытом: на запрос от клиента
Код:
<policy-file-request/>
отдать
Код:
<cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>\0
Когда сокетный сервер был на C# - это срабатывало, соединение само рвалось и переподключалось (это вроде обязательное условие - надо соединение принудительно разрывать со стороны сервера...)
Но так у меня пока не работает. И принудительно stream.end делал - не работает...

А как прослушивать:
Server.listen(7000,"ip");
Server.listen(7001,"ip");
Server.listen(7002,"ip");
Так не сработает?

Старый 28.12.2011, 00:51
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 3  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
О! Родственная душа В общем я два дня терроризирую общественность на всех тематических ресурсах.
Есть варианты решения:
1. https://github.com/freeformsystems/node-fxs
2. https://github.com/3rd-Eden/FlashPolicyFileServer

Оба у меня не сработали. Или ошибки или пермишн денай. Но все именно работают по тому принципу, что ты и предлагаешь. Грешу на бесплатный хостинг который использует node-http-proxy

Локально отлаживать политику безопасности бесполезно - все зависит от настроек сервера хостинга, которых не знаешь.

Поясни плиз, где ты видишь этот запрос <policy-file-request/> от клиента? Нигде не вижу.

Старый 28.12.2011, 10:00
_SoWa вне форума Посмотреть профиль Отправить личное сообщение для _SoWa Найти все сообщения от _SoWa
  № 4  
Ответить с цитированием
_SoWa
 
Аватар для _SoWa

Регистрация: Oct 2009
Сообщений: 72
Настройки хостинга себя я знаю - он на моем компе в виртуальной машине, IP белый и роутером порты проброшены Поэтому приходится просить друзей тыкаться в мою маленькую флешку для настройки

А так как хостинг у меня дома, то Node.js у меня 0.6.6 собранный руками.
Скрипт:
Код:
var net = require("net"), sys = require('sys');
var server = net.createServer(function (stream) {
stream.setEncoding("utf8");
stream.on("connect", function () {
stream.write("hello\0");
sys.puts(sys.inspect(stream, false));
});
stream.on("data", function (data) {

if (data == "<policy-file-request/>")
{
    var secure = "<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\"/></cross-domain-policy>\0"; //
    stream.write(secure);
    console.log("POLICY "+secure);
    stream.end(); //Опционально: и с ним, и без него пробовал
}
else
{
    console.log("not secure: "+data);
    stream.write(data);
}
});
stream.on("end", function () {
stream.end();
});
});
server.listen(843, "10.0.0.11");
Запуск sudo node server.js
Говорят, что 843 порт какой-то шибко важный, поэтому sudo, хотя когда проблему решу, уберу запуст от рута
Вот вывод консоли при коннекте от sys.puts(sys.inspect(stream, false)):
Код:
^Croot@ubuntu:~/web/nodeApps# sudo node server.js 
The "sys" module is now called "util". It should have a similar interface.
{ _handle: 
   { writeQueueSize: 0,
     socket: [Circular],
     onread: [Function: onread] },
  _pendingWriteReqs: 1,
  _flags: 0,
  _connectQueueSize: 0,
  destroyed: false,
  bytesRead: 0,
  bytesWritten: 6,
  allowHalfOpen: false,
  writable: true,
  readable: true,
  server: 
   { _events: { connection: [Function] },
     connections: 1,
     allowHalfOpen: false,
     _handle: 
      { writeQueueSize: 0,
        onconnection: [Function: onconnection],
        socket: [Circular] } },
  _decoder: 
   { encoding: 'utf8',
     charBuffer: <Buffer 08 89 75 fc>,
     charReceived: 0,
     charLength: 0 },
  _events: { connect: [Function], data: [Function], end: [Function] } }
POLICY <?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" to-ports="*"/></cross-domain-policy>
Т.е. у меня раньше стоял console.log(data) и я видел <policy-file-request/>, теперь там условие и вывода на консоль нет, зато выводит, что отправляется к флешу политка

Кстати, я у себя кажется нашел ошибку В onConnect писать hello не стоит, наверно, если флешка ждет хмл безопасности.


Последний раз редактировалось _SoWa; 28.12.2011 в 10:20.
Старый 28.12.2011, 11:46
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 5  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Ну как, получилось без hello?
У меня подключение сервера через "http", а не через "net". Можно использовать и то и это вместе? Сейчас попробую.

Добавлено через 24 минуты
В общем опять ничего не получается
Добавил твой вызов в свой сервер - он упал. Вот лог консоли:
Код:
28 Dec 08:06:06 - [INFO] You asked to listen on port: 843, but cloudnode will use port: 8288 instead..
28 Dec 08:06:06 - [INFO] You asked to listen on port: 10843, but cloudnode will use port: 8288 instead..
   info  - socket.io started
28 Dec 08:06:06 - [INFO] Cloudnode listening on port: 8288
Socket-Game listening on port 8288.. Go to http://<this-host>:8288
   info  - flashpolicyfileserver received an error event:
eaddrinuse, address already in use
   warn  - error raised: Error: EADDRINUSE, Address already in use
{ bufferSize: 0,
  fd: 8,
  type: 'tcp4',
  allowHalfOpen: false,
  _readWatcher: 
   { socket: [Circular],
     callback: [Function: onReadable] },
  destroyed: false,
  readable: true,
  _writeQueue: [],
  _writeQueueEncoding: [],
  _writeQueueFD: [],
  _writeQueueCallbacks: [],
  _writeWatcher: 
   { socket: [Circular],
     callback: [Function: onWritable] },
  writable: true,
  _writeImpl: [Function],
  _readImpl: [Function],
  _shutdownImpl: [Function],
  remoteAddress: '127.0.0.1',
  remotePort: 50213,
  server: 
   { _events: { connection: [Function] },
     connections: 1,
     allowHalfOpen: false,
     watcher: { host: [Circular], callback: [Function] },
     listen: [Function],
     type: 'tcp4',
     fd: 9 },
  _decoder: 
   { encoding: 'utf8',
     charBuffer: <Buffer 00 00 00 00>,
     charReceived: 0,
     charLength: 0 },
  _events: 
   { connect: [Function],
     data: [Function],
     end: [Function] } }
not secure: GET / HTTP/1.1
.....
Слушал на разных портах/хостах - примерно везде одинаково Error: EADDRINUSE, Address already in use
Как вообще правильно: '127.0.0.1' или 'mygame.cloudno.de'? И разве я могу на хостинге слушать 843 порт?

А это " You asked to listen on port: 10843, but cloudnode will use port: 8288 instead.." вообще не понятно откуда. Нигде этот порт 10843 не использую.

Старый 28.12.2011, 13:15
_SoWa вне форума Посмотреть профиль Отправить личное сообщение для _SoWa Найти все сообщения от _SoWa
  № 6  
Ответить с цитированием
_SoWa
 
Аватар для _SoWa

Регистрация: Oct 2009
Сообщений: 72
Видимо хостинг у тебя только 8288 порт открыл...
У меня без hello таки-заработало, да

Я бы тебе предложил, если данными обмениваешься по HTTP, то сперва подключайся сокетом, получай политику безопасности, а потом пробуй HTTP.
У меня, как оказалось, рвать соединение не нужно - ноде сам разрывает и восстанавливает.
Вот рабочий код:
Код:
var net = require("net"), sys = require('sys');
var server = net.createServer(function (stream) {
stream.setEncoding("utf8");
stream.on("connect", function () {
sys.puts(sys.inspect(stream, false));
});
stream.on("data", function (data) {

if (data == "<policy-file-request/>\0")
{
    var secure = "<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\"/></cross-domain-policy>\0"; //
    stream.write(secure);
    console.log("POLICY "+secure);
}
else
{
    console.log("not secure: "+data);
    stream.write(data);
}
});
stream.on("end", function () {
stream.end();
});
});
server.listen(843, "10.0.0.11");
server.listen(843, "Мой IP");
К сожалений, сейчас нет возможности пробросить другой порт, вечером попробую и отпишу результат.

Добавлено через 55 секунд
Видишь, у тебя заголовок пакета первым приходит: not secure: GET / HTTP/1.1, а у меня в сокет сразу запрос политики безопасности.

Старый 28.12.2011, 13:31
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 7  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Цитата:
Видишь, у тебя заголовок пакета первым приходит: not secure: GET / HTTP/1.1, а у меня в сокет сразу запрос политики безопасности.
Не, это лог с хостинга. Там все наоборот. Первые сообщения выше.

Цитата:
Я бы тебе предложил, если данными обмениваешься по HTTP, то сперва подключайся сокетом, получай политику безопасности, а потом пробуй HTTP.
В смысле сокетом?

Старый 28.12.2011, 17:46
_SoWa вне форума Посмотреть профиль Отправить личное сообщение для _SoWa Найти все сообщения от _SoWa
  № 8  
Ответить с цитированием
_SoWa
 
Аватар для _SoWa

Регистрация: Oct 2009
Сообщений: 72
К моему коду цепляться с помощью XMLSocket:
Код AS3:
xmlSocket = new XMLSocket();
xmlSocket.addEventListener(DataEvent.DATA, onIncomingData);
xmlSocket.connect("IP", 7000);

Старый 28.12.2011, 21:35
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 9  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
_SoWa, можно по полочкам? А то опять ерунда какая-то. Такого никогда ещё не было, чтобы на хостинге 5 дней не могу простейшую страничку запустить...

1. Создаю в главной флэшке:
Код AS3:
protected function init():void
			{
				var xmlSocket:XMLSocket = new XMLSocket();
				xmlSocket.addEventListener(DataEvent.DATA, onIncomingData);
				xmlSocket.connect("127.0.0.1", 8293);//вот тут какой хост прописывать? localhost или реальный домен приложения? Порт у меня один - 8293
			}
2. server.js - это сервер ноды.
Сначала слушаю net:
Код:
var net = require("net"), sys = require('sys');
var server = net.createServer(function (stream) {
stream.setEncoding("utf8");
stream.on("connect", function () {
sys.puts(sys.inspect(stream, false));
});
stream.on("data", function (data) {

if (data == "<policy-file-request/>\0")
{
    var secure = "<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\"/></cross-domain-policy>\0"; //
    console.log("POLICY "+secure);
	stream.write(secure);
}
else
{
    console.log("not secure: "+data);
    stream.write(data);
}
});
stream.on("end", function () {
stream.end();
});
});
//server.listen(843, "127.0.0.1");//этот запрос приводит к тому что в логе сервер пишет, что бесполезно слушать 843 порт, все равно буду слушать только 8293
server.listen(8293, "127.0.0.1");
Ниже начинаю слушать http в том же server.js:
Код:
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});
			//var secure = "<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\"/></cross-domain-policy>\0";
			//response.write (secure);
			//console.log("POLICY "+secure);
			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();
			  }
			});
		  });
		}
	  });
	
	});
if (!module.parent) {
  app.listen(8293);
  console.log("Socket-Game listening on port 8291.. ");
}
3. В результате сервер падает с 500 error.
Код:
28 Dec 17:22:50 - Cloudnode wrapped script starting (5453) at Wed Dec 28 2011 17:22:50 GMT+0100 (UTC)
28 Dec 17:22:50 - [INFO] Cloudnode listening on port: 8293
28 Dec 17:22:50 - [INFO] You asked to listen on port: 10843, but cloudnode will use port: 8293 instead..
   [36minfo  -[39m socket.io started
28 Dec 17:22:50 - [INFO] Cloudnode listening on port: 8293
Socket-Game listening on port 8291.. 
   [36minfo  -[39m flashpolicyfileserver received an error event:
eaddrinuse, address already in use
   [33mwarn  -[39m error raised: Error: EADDRINUSE, Address already in use
{ bufferSize: 0,
  fd: 8,
  type: 'tcp4',
  allowHalfOpen: false,
  _readWatcher: 
   { socket: [Circular],
     callback: [Function: onReadable] },
  destroyed: false,
  readable: true,
  _writeQueue: [],
  _writeQueueEncoding: [],
  _writeQueueFD: [],
  _writeQueueCallbacks: [],
  _writeWatcher: 
   { socket: [Circular],
     callback: [Function: onWritable] },
  writable: true,
  _writeImpl: [Function],
  _readImpl: [Function],
  _shutdownImpl: [Function],
  remoteAddress: '127.0.0.1',
  remotePort: 34835,
  server: 
   { _events: { connection: [Function] },
     connections: 1,
     allowHalfOpen: false,
     watcher: { host: [Circular], callback: [Function] },
     listen: [Function],
     type: 'tcp4',
     fd: 9 },
  _decoder: 
   { encoding: 'utf8',
     charBuffer: <Buffer 00 00 00 00>,
     charReceived: 0,
     charLength: 0 },
  _events: 
   { connect: [Function],
     data: [Function],
     end: [Function] } }
not secure: GET / HTTP/1.1

host: myapp.cloudno.de

user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0.1) Gecko/20100101 Firefox/8.0.1

accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

accept-language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3

accept-encoding: gzip, deflate

accept-charset: windows-1251,utf-8;q=0.7,*;q=0.7

connection: keep-alive

cache-control: max-age=0

x-forwarded-for: 34.155.192.121

x-forwarded-port: 59778

x-forwarded-proto: http
Запись flashpolicyfileserver received an error event:
eaddrinuse, address already in use
[33mwarn -[39m error raised: Error: EADDRINUSE, Address already in use
доказывает что проблема в политике безопасности.

Прежде чем долбить саппорт хостинга (он бесплатный могут и не ответить), подскажи - все ли верно делаю?

Старый 28.12.2011, 22:45
_SoWa вне форума Посмотреть профиль Отправить личное сообщение для _SoWa Найти все сообщения от _SoWa
  № 10  
Ответить с цитированием
_SoWa
 
Аватар для _SoWa

Регистрация: Oct 2009
Сообщений: 72
А у тебя кто вот эти сообщения высылает?
Код:
   [36minfo  -[39m socket.io started
28 Dec 17:22:50 - [INFO] Cloudnode listening on port: 8293
Socket-Game listening on port 8291.. 
   [36minfo  -[39m flashpolicyfileserver received an error event:
eaddrinuse, address already in use
   [33mwarn  -[39m error raised: Error: EADDRINUSE, Address already in use
Добавлено через 42 секунды
Цитата:
вот тут какой хост прописывать?
IP на хостинге

Добавлено через 1 минуту
Хотя я попробовал сейчас - можно и хост писать

Создать новую тему Ответ Часовой пояс GMT +4, время: 05:31.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
node.js , webSocket

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 05:31.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.