Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Веб-программирование > JavaScript / HTML

JavaScript / HTML Создание динамической разметки страниц

Ответ
 
Опции темы
Старый 11.11.2013, 09:10   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,499
Написано 2,955 полезных сообщений
(для 5,220 пользователей)
Node JS net модуль

В общем проблема с регистрацией отключений от сервера. Может и в коде есть какие-то косяки... надо искать. Сейчас самое главное понять как правильно ловить отключение сокета.

В общем вопрос такой: Какой эвент приходит всегда при отключении?

Такое ощущение, что евент 'close' срабатывает не во всех случаях... 'end' срабатывает всегда?
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 11.11.2013, 21:13   #2
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,453 полезных сообщений
(для 6,859 пользователей)
Ответ: Node JS net модуль

На сервере, клиентский сокет выдаст 'end' только в случае при получении пакета FIN от клиента. Это естественно не всегда будет так.
Иногда нужно слушать 'error' тоже, хотя документация говорит о 'close' всегда после него.
'close' выдаст только когда сокет полностью закрыли.

Какую версию node.js используешь? (node --version) или process.version
Возможно сокет хандлиться по какой-то причине.

Проверь если end + error + close хоть один но будет всегда триггериться, то нужно проверить где стопорится.

Также есть ещё setTimeout если ты будешь уверен что сервер будет периодически пинговать клиента, то ставь таймаут.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (12.11.2013)
Старый 12.11.2013, 03:09   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,499
Написано 2,955 полезных сообщений
(для 5,220 пользователей)
Ответ: Node JS net модуль

Да уже поставил для теста дисконнект во все эвенты, в таймаут тоже. Тестируем. Версию нода у ant2on'а спрошу. Я разрабатываю на последней версии. Про пинг думал, но это как бы костыль имхо. Но в будущем его заюзаю.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 12.11.2013, 07:38   #4
Phantom
Элита
 
Аватар для Phantom
 
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,120
Написано 691 полезных сообщений
(для 1,722 пользователей)
Ответ: Node JS net модуль

Экспериментировал как-то с WebSocket, написал простой код, вроде бы без ошибок и решил его нагнуть путём соединения, отправки пакета, отсоединения с нескольких клиентов в цикле почти без задержки. В итоге периодически на сервере выскакивало исключение, уже точно не помню какое. В принципе если его гасить обработчиком всех неперехваченных исключений, всё работает как надо и утечек вроде нет, но как избавиться от него, я так и не понял. Гугл тоже не помог. Сервер запускал на Windows 7, возможно проблема специфична для винды.
(Offline)
 
Ответить с цитированием
Старый 12.11.2013, 09:30   #5
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,499
Написано 2,955 полезных сообщений
(для 5,220 пользователей)
Ответ: Node JS net модуль

Ну вэбсокеты меня не интересуют. Проверили снова. Все еще не всех дисконнектит...
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 12.11.2013, 20:48   #6
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,453 полезных сообщений
(для 6,859 пользователей)
Ответ: Node JS net модуль

pax код в студию.
И способ воспроизведения.

Phantom, когда говоришь о конкретном модуле - референс давай на него, в socket.io там есть heartbeat и нужно учитывать - это не баг а фича.
А вот в 'ws' не трогал, но там постоянно фиксы выходят.

В 95% подобных багах я в итоге находил причины которые были на моей стороне от части - недопонимание каких-то настроек и т.п.
Бывают проблемы на стороне модуля - но нужно всегда ловить и делать конкретный пример воспроизведения, и не лениться создавать issue на гите, я так в mongodb например баг серьёзный описал - пофиксили через неделю!
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Phantom (12.11.2013)
Старый 12.11.2013, 21:21   #7
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,499
Написано 2,955 полезных сообщений
(для 5,220 пользователей)
Ответ: Node JS net модуль

Сообщение от moka Посмотреть сообщение
pax код в студию.
И способ воспроизведения.
Кода сейчас достаточно много, чтобы его сюда выкладывать и надо клиент на Unity тоже.

Регулярная отсылка пинг-пакета успешно отсоединяет клиентов.

Исправил баг неверной передачи размера пакета, сервер в этом случае пытался ждать большого объема данных, но почему не дисконнектил при дисконнекте клиента все еще не понятно. Тестируем дальше.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 13.11.2013, 10:17   #8
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,499
Написано 2,955 полезных сообщений
(для 5,220 пользователей)
Ответ: Node JS net модуль

Написал сервер-сервер сеть
var util = require('util');
var 
NodeSharpTCP = require('NodeSharpTCP');

// евент сервер
var EventServer NodeSharpTCP.EventServer;

var 
server = new EventServer();
server.setSendRate(10);

server.on('connection', function (client) {

    
console.log('Clients: ' server.clients.length);

    
client.on('disconnect', function () {
        
console.log('Clients: ' server.clients.length);
    });

    
client.on('World', function (data) {
        
console.log('World: ' util.inspect(data));
        
client.emit('Hello'data 1);
    });

    
client.emit('Hello'1);
});


server.listen(8124, function () {
    
console.log('Event Server bound')
});


// клиент евент сервера
var EventServerClient NodeSharpTCP.EventServerClient;

var 
client = new EventServerClient();
client.setSendRate(10);

client.on('Hello', function (data) {
    
console.log('Hello: ' util.inspect(data));
    
client.emit('World'data 1);
});

client.connect(8124'localhost', function () {
    
console.log('client connected');
}); 
Результат работы
C:\nodejs\node.exe eventServerClientTest.js
Event Server bound
client connected
Clients: 1
Hello: 1
World: 2
Hello: 3
World: 4
Hello: 5
World: 6
Hello: 7
World: 8
Hello: 9
World: 10
Hello: 11
...
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
moka (13.11.2013)
Старый 13.11.2013, 20:46   #9
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,453 полезных сообщений
(для 6,859 пользователей)
Ответ: Node JS net модуль

Думаю не нужно использовать Event в node.js, т.к. это и так подрузумевается и обыденное дело.

А так збсь, только вопрос: что за магическое число 10 setSendRate?
Есть на гите?
(Offline)
 
Ответить с цитированием
Старый 14.11.2013, 03:27   #10
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,499
Написано 2,955 полезных сообщений
(для 5,220 пользователей)
Ответ: Node JS net модуль

Сообщение от moka Посмотреть сообщение
Думаю не нужно использовать Event в node.js, т.к. это и так подрузумевается и обыденное дело.
Не понял на счет Event, не использовать приставку к объектам? У меня там есть отдельно TCPSetrver и TCPServerClient, т.к. евент сервер и клиент это обертки над ними.

Сообщение от moka Посмотреть сообщение
А так збсь, только вопрос: что за магическое число 10 setSendRate?
Это частота отправки. 10 раз в секунду. Если приходит много пакетов, то при отправке они клеятся в один буфер.

Кстати по этому поводу есть вопрос по архитектуре. Сейчас у меня общий цикл, который берет всех клиентов которым пришли пакеты и по очереди отправляет, т.е. я собираю в массив всех кому пришли пакеты. При отправке я создаю новый пустой массив, а текущий перебираю. Это норм, или каждому клиенту сделать свой цикл с setTimeout?

Сообщение от moka Посмотреть сообщение
Есть на гите?
Сейчас оно на моем сервере на svn, по поводу публичного доступа я пока еще не думал.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 15.11.2013, 00:33   #11
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,453 полезных сообщений
(для 6,859 пользователей)
Ответ: Node JS net модуль

Сообщение от pax Посмотреть сообщение
Не понял на счет Event, не использовать приставку к объектам? У меня там есть отдельно TCPSetrver и TCPServerClient, т.к. евент сервер и клиент это обертки над ними.
Ну ты всё ещё в синхронном мире Обычно если такие вещи делают то естественно только асинхронно, т.к. это же IO.


Сообщение от pax Посмотреть сообщение
Это частота отправки. 10 раз в секунду. Если приходит много пакетов, то при отправке они клеятся в один буфер.
Уф.
Ну тут важно одно - соблюдать очередь вызовов отправки, остальное не важно.
У тебя есть stream'ы, засунуть в них данные на отправку времени много не занимает (смотря как сериализаия сделана).
Поэтому не думаю что стоит тут пытаться переоптимизировать (клеить пакеты и т.п.).
Пользователь вызвал - вот и шли сразу, не стоит делать таймауты и задержки, т.к. это лишние телодвижения.
Тем более если мы хотим что-то подобное:
socket.emit('foo');
socket.disconnect(); 
Сообщение от pax Посмотреть сообщение
Кстати по этому поводу есть вопрос по архитектуре. Сейчас у меня общий цикл, который берет всех клиентов которым пришли пакеты и по очереди отправляет, т.е. я собираю в массив всех кому пришли пакеты. При отправке я создаю новый пустой массив, а текущий перебираю. Это норм, или каждому клиенту сделать свой цикл с setTimeout?
Не нужно никаких циклов и итераций. Кодер хочет слать сообщение - вот и шли сообщение. Шлёт слишком много? - проблема кодера. Если он сам не заботиться о нормальных пакетах и т.п. Тем более в играх редко используют event-основанную систему, а чаще всего шлют пакеты со state'ами а они большие.
Так что юзер сам об этом должен заботиться, и не пытайся решать за него какие-то задачи, тем более если это вносит задержку в 10мс.
Т.к. делая это в node.js - это не сэкономит на производительности, процессору всё равно это нужно сделать и если это делает node то это выполняется в том же потоке - следственно от перестановки мест - скорость не поменяется, а вот задержку этим ты создашь.

Если тебя заботит скорость сериализации - то тут нужно брать C++ и писать именно эту часть как Addon (module), в нете полно доков и будет очень подобно C# в плане работы с данными.

В разработке node модулей очень важно соблюдать их простоту и конкретность в том что они делают. А юзер уже сам там решит что и как с этим делать (нужно клеить пакеты или не нужно и т.п.).
Т.к. ты по сути сделал NoDelay (Nagle's Algorithm).

Сообщение от pax Посмотреть сообщение
Сейчас оно на моем сервере на svn, по поводу публичного доступа я пока еще не думал.
Можно заюзать bitbucket в котором есть приватные бесплатные репозитории.
Я бы хотел изучить то как работает модуль и что он пытается сделать, и разработать архитектуру которая будет удобна в использовании и достаточно гибка для возможных изменений, и обсудили бы это далее..
(Offline)
 
Ответить с цитированием
Старый 15.11.2013, 03:21   #12
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,499
Написано 2,955 полезных сообщений
(для 5,220 пользователей)
Ответ: Node JS net модуль

Сообщение от moka Посмотреть сообщение
Ну тут важно одно - соблюдать очередь вызовов отправки, остальное не важно.
Ты сам говорил когда-то, что твой сервер при реалтайме загибался когда в комнате 20 игроков и каждый шлет 30 раз в секунду сообщения по 10 байт к примеру. С учетом TCP заголовка это еще + 40..60 байт.

Функционал склейки сообщений отключается если не нужен.

Сообщение от moka Посмотреть сообщение
Тем более если мы хотим что-то подобное:
socket.emit('foo');
socket.disconnect(); 
Вот про это спасибо, вероятно у меня это не прокатит если используется склейка пакетов).

Сообщение от moka Посмотреть сообщение
Можно заюзать bitbucket в котором есть приватные бесплатные репозитории.
Я бы хотел изучить то как работает модуль и что он пытается сделать, и разработать архитектуру которая будет удобна в использовании и достаточно гибка для возможных изменений, и обсудили бы это далее..
Могу дать доступ к svn.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 16.11.2013, 01:27   #13
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,453 полезных сообщений
(для 6,859 пользователей)
Ответ: Node JS net модуль

Сообщение от pax Посмотреть сообщение
Ты сам говорил когда-то, что твой сервер при реалтайме загибался когда в комнате 20 игроков и каждый шлет 30 раз в секунду сообщения по 10 байт к примеру. С учетом TCP заголовка это еще + 40..60 байт.
У меня ложилось потому что у меня руки кривые
30 раз в секунду по 40-60 байт это 36000 байт в секунду на пользователя, весьма не оптимизированный объём данных и т.п. имхо, и 30 раз в секунду - слишком часто для большинства, тем более ММО игр.
Да и это скорее проблемы разраба а не твои

Сообщение от pax Посмотреть сообщение
Функционал склейки сообщений отключается если не нужен.
Если он опциональная фича по стандарту (выключен), то это вполне нормально.

Сообщение от pax Посмотреть сообщение
Могу дать доступ к svn.
На этих выходных 48 часовой hackathon, так что буду кодить все выходны, и на работе сегодня был тоже hackathon весь день так что гляну на следующей недели.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


Часовой пояс GMT +1, время: 07:11.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com