Node JS net модуль
В общем проблема с регистрацией отключений от сервера. Может и в коде есть какие-то косяки... надо искать. Сейчас самое главное понять как правильно ловить отключение сокета.
В общем вопрос такой: Какой эвент приходит всегда при отключении? Такое ощущение, что евент 'close' срабатывает не во всех случаях... 'end' срабатывает всегда? |
Ответ: Node JS net модуль
На сервере, клиентский сокет выдаст 'end' только в случае при получении пакета FIN от клиента. Это естественно не всегда будет так.
Иногда нужно слушать 'error' тоже, хотя документация говорит о 'close' всегда после него. 'close' выдаст только когда сокет полностью закрыли. Какую версию node.js используешь? (node --version) или process.version Возможно сокет хандлиться по какой-то причине. Проверь если end + error + close хоть один но будет всегда триггериться, то нужно проверить где стопорится. Также есть ещё setTimeout если ты будешь уверен что сервер будет периодически пинговать клиента, то ставь таймаут. |
Ответ: Node JS net модуль
Да уже поставил для теста дисконнект во все эвенты, в таймаут тоже. Тестируем. Версию нода у ant2on'а спрошу. Я разрабатываю на последней версии. Про пинг думал, но это как бы костыль имхо. Но в будущем его заюзаю.
|
Ответ: Node JS net модуль
Экспериментировал как-то с WebSocket, написал простой код, вроде бы без ошибок и решил его нагнуть путём соединения, отправки пакета, отсоединения с нескольких клиентов в цикле почти без задержки. В итоге периодически на сервере выскакивало исключение, уже точно не помню какое. В принципе если его гасить обработчиком всех неперехваченных исключений, всё работает как надо и утечек вроде нет, но как избавиться от него, я так и не понял. Гугл тоже не помог. Сервер запускал на Windows 7, возможно проблема специфична для винды.
|
Ответ: Node JS net модуль
Ну вэбсокеты меня не интересуют. Проверили снова. Все еще не всех дисконнектит...
|
Ответ: Node JS net модуль
pax код в студию.
И способ воспроизведения. Phantom, когда говоришь о конкретном модуле - референс давай на него, в socket.io там есть heartbeat и нужно учитывать - это не баг а фича. А вот в 'ws' не трогал, но там постоянно фиксы выходят. В 95% подобных багах я в итоге находил причины которые были на моей стороне от части - недопонимание каких-то настроек и т.п. Бывают проблемы на стороне модуля - но нужно всегда ловить и делать конкретный пример воспроизведения, и не лениться создавать issue на гите, я так в mongodb например баг серьёзный описал - пофиксили через неделю! |
Ответ: Node JS net модуль
Цитата:
Регулярная отсылка пинг-пакета успешно отсоединяет клиентов. Исправил баг неверной передачи размера пакета, сервер в этом случае пытался ждать большого объема данных, но почему не дисконнектил при дисконнекте клиента все еще не понятно. Тестируем дальше. |
Ответ: Node JS net модуль
Написал сервер-сервер сеть
PHP код:
Код:
C:\nodejs\node.exe eventServerClientTest.js |
Ответ: Node JS net модуль
Думаю не нужно использовать Event в node.js, т.к. это и так подрузумевается и обыденное дело.
А так збсь, только вопрос: что за магическое число 10 setSendRate? Есть на гите? |
Ответ: Node JS net модуль
Цитата:
Цитата:
Кстати по этому поводу есть вопрос по архитектуре. Сейчас у меня общий цикл, который берет всех клиентов которым пришли пакеты и по очереди отправляет, т.е. я собираю в массив всех кому пришли пакеты. При отправке я создаю новый пустой массив, а текущий перебираю. Это норм, или каждому клиенту сделать свой цикл с setTimeout? Цитата:
|
Ответ: Node JS net модуль
Цитата:
Цитата:
Ну тут важно одно - соблюдать очередь вызовов отправки, остальное не важно. У тебя есть stream'ы, засунуть в них данные на отправку времени много не занимает (смотря как сериализаия сделана). Поэтому не думаю что стоит тут пытаться переоптимизировать (клеить пакеты и т.п.). Пользователь вызвал - вот и шли сразу, не стоит делать таймауты и задержки, т.к. это лишние телодвижения. Тем более если мы хотим что-то подобное: PHP код:
Цитата:
Так что юзер сам об этом должен заботиться, и не пытайся решать за него какие-то задачи, тем более если это вносит задержку в 10мс. Т.к. делая это в node.js - это не сэкономит на производительности, процессору всё равно это нужно сделать и если это делает node то это выполняется в том же потоке - следственно от перестановки мест - скорость не поменяется, а вот задержку этим ты создашь. Если тебя заботит скорость сериализации - то тут нужно брать C++ и писать именно эту часть как Addon (module), в нете полно доков и будет очень подобно C# в плане работы с данными. В разработке node модулей очень важно соблюдать их простоту и конкретность в том что они делают. А юзер уже сам там решит что и как с этим делать (нужно клеить пакеты или не нужно и т.п.). Т.к. ты по сути сделал NoDelay (Nagle's Algorithm). Цитата:
Я бы хотел изучить то как работает модуль и что он пытается сделать, и разработать архитектуру которая будет удобна в использовании и достаточно гибка для возможных изменений, и обсудили бы это далее.. |
Ответ: Node JS net модуль
Цитата:
Функционал склейки сообщений отключается если не нужен. Цитата:
Цитата:
|
Ответ: Node JS net модуль
Цитата:
30 раз в секунду по 40-60 байт это 36000 байт в секунду на пользователя, весьма не оптимизированный объём данных и т.п. имхо, и 30 раз в секунду - слишком часто для большинства, тем более ММО игр. Да и это скорее проблемы разраба а не твои ;) Цитата:
Цитата:
|
Часовой пояс GMT +4, время: 10:58. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot