![]() |
|
||||||||||
|
|||||
|
Кому либо приходилось работать с этими технологиями (одновременно)?
Третий день бьюсь: на локалхосте все отлично - на хостинге какие-то проблемы. Подозреваю что проблема в 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, но похоже все намного сложнее. Этот модуль какой-то бредовый, вызывает ошибки. Как мне вообще можно на одном хостинге слушать сразу два порта? |
|
|||||
|
Регистрация: Oct 2009
Сообщений: 72
|
Такая же проблема. Косяк в политике безопасности. Если вывод в консоль на сервере поставить, можно увидеть, что приходит запрос файла политики безопасности. Мне бы попроще совет - как локально поотлаживать эту политику безопасности....
Я пытаюсь пока решить эту проблему по аналогии со своим прошлым опытом: на запрос от клиента отдать Когда сокетный сервер был на C# - это срабатывало, соединение само рвалось и переподключалось (это вроде обязательное условие - надо соединение принудительно разрывать со стороны сервера...) Но так у меня пока не работает. И принудительно stream.end делал - не работает... А как прослушивать: Server.listen(7000,"ip"); Server.listen(7001,"ip"); Server.listen(7002,"ip"); Так не сработает? |
|
|||||
|
О! Родственная душа
В общем я два дня терроризирую общественность на всех тематических ресурсах. Есть варианты решения: 1. https://github.com/freeformsystems/node-fxs 2. https://github.com/3rd-Eden/FlashPolicyFileServer Оба у меня не сработали. Или ошибки или пермишн денай. Но все именно работают по тому принципу, что ты и предлагаешь. Грешу на бесплатный хостинг который использует node-http-proxy Локально отлаживать политику безопасности бесполезно - все зависит от настроек сервера хостинга, которых не знаешь. Поясни плиз, где ты видишь этот запрос <policy-file-request/> от клиента? Нигде не вижу. |
|
|||||
|
Регистрация: 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");
Говорят, что 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>
Кстати, я у себя кажется нашел ошибку В onConnect писать hello не стоит, наверно, если флешка ждет хмл безопасности.Последний раз редактировалось _SoWa; 28.12.2011 в 10:20. |
|
|||||
|
Ну как, получилось без 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..
[36minfo -[39m 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
[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: 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
.....
Как вообще правильно: '127.0.0.1' или 'mygame.cloudno.de'? И разве я могу на хостинге слушать 843 порт? А это " You asked to listen on port: 10843, but cloudnode will use port: 8288 instead.." вообще не понятно откуда. Нигде этот порт 10843 не использую. |
|
|||||
|
Регистрация: 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, а у меня в сокет сразу запрос политики безопасности. |
|
|||||
|
Цитата:
Цитата:
|
|
|||||
|
Регистрация: Oct 2009
Сообщений: 72
|
К моему коду цепляться с помощью XMLSocket:
|
|
|||||
|
_SoWa, можно по полочкам? А то опять ерунда какая-то. Такого никогда ещё не было, чтобы на хостинге 5 дней не могу простейшую страничку запустить...
1. Создаю в главной флэшке: protected function init():void { var xmlSocket:XMLSocket = new XMLSocket(); xmlSocket.addEventListener(DataEvent.DATA, onIncomingData); xmlSocket.connect("127.0.0.1", 8293);//вот тут какой хост прописывать? localhost или реальный домен приложения? Порт у меня один - 8293 } Сначала слушаю 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");
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.. ");
}
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
eaddrinuse, address already in use [33mwarn -[39m error raised: Error: EADDRINUSE, Address already in use доказывает что проблема в политике безопасности. Прежде чем долбить саппорт хостинга (он бесплатный могут и не ответить), подскажи - все ли верно делаю? |
|
|||||
|
Регистрация: 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 Цитата:
Добавлено через 1 минуту Хотя я попробовал сейчас - можно и хост писать |
![]() |
![]() |
Часовой пояс GMT +4, время: 09:08. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| node.js , webSocket |
|
|