RS Game Maker Community
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

 
Расширенный поиск
  Главная  Форум   Вики Блоги FAQ Игры Статьи Примеры Войти Регистрация  
Вики
Все желающие приглашаются редактировать вики. Можете писать о своих (или чужих) играх, размещать туториалы, постить статьи - главное навесить категорию.
Страниц: 1   Вниз
  Печать  
Сервер GMS через Electron(nodejs)
0 Пользователей и 1 Гость смотрят эту тему.
ELGReeN
Активный участник
**

Репутация: 8
Offline Offline

Сообщений: 122


06 Ноября 2016 в 10:44
Сервер GMS через Electron

Для кого:
Если Вам нужен более менее мощный сервер(ПО) для игры, но не хочется вылезать из зоны комфорта ГМа и учить новые языки, такие как JS/Erlang/C++/C# и прочие(нет, без JS все таки полностью не получится обойтись).

Что используется:
Фреймворк Electron - http://gmakers.ru/index.php?topic=7158
JS Расширение gmCallback - http://gmc.yoyogames.com/index.php?showtopic=549404
JS Расширение nodejs4gm
Game Maker Studio 1.4 с работающим модулем экспорта HTML5

Как:
Проект GMS скомпилированный в html5, запускается в Electron для доступа к серверной библиотеки/фреймворку NODEJS или просто NODE.
В следствии чего можно вызывать сетевые функции nodejs из js расширения для GMS.
Так как сам JS и nodejs асинхронны, нам понадобится расширение gmCallback для того что бы когда что то происходит, вызывались наши специальные скрипты(колбэки - обратные вызовы) в GMS из расширения nodejs4gm.

Зачем:
В движке JS V8 который встроен в electron, код выполняется быстрее.
+ Если вдруг, кто то все таки будет это использовать, появляется вероятность что кто то добавит какие либо функции из nodejs в расширение nodejs4gm, и поделится со всеми.

В прилагаемом проекте Вы найдете:
Скрипты колбэки:

//===== scr_nodejs_onConnect
// Этот скрипт вызывается из расширения nodejs4gm.js при
// подключении нового клиентского сокета, в аргументе0 будет его id (сгенерированный так: c.remoteAddress + ':' + c.remotePort)
// argument0 = Сокет

//===== scr_nodejs_onData
// Этот скрипт вызывается из расширения nodejs4gm.js при
// получении данных через клиентский сокет
// argument0 = Сокет
// argument1 = Данные

//===== scr_nodejs_onEnd
// Этот скрипт вызывается из расширения nodejs4gm.js при
// отключении клиентского сокета
// argument0 = Сокет

//===== scr_nodejs_onTimeout
// Этот скрипт вызывается из расширения nodejs4gm.js при
// срабатывании тайм аута
// argument0 = text1
// argument1 = text2
// argument2 = text3

//===== scr_nodejs_onFS
// Этот скрипт вызывается из расширения nodejs4gm.js при
// окончании работы файловой функции, в аргументе0 будет его id (определенный вами)
// argument0 = ID
// argument1 = данные или статус выполнения

Функции:
nodejs_net_createServer(1234); //Создание сервера на порту.

nodejs_net_socketWrite(socket, data); //Запись в клиентский сокет данные и их отправка
// Вернет истину если данные записаны в буфер ядра, или ложь если все или часть данных была помещена в очередь в памяти

nodejs_net_socketDestroy(socket); //Закрывает сокет сразу

nodejs_net_socketEnd(socket)
//Корректно закрывает сокет(string), оставшиеся в буффере данные досылаются, отправляет пакет FIN.

nodejs_net_createConnection(port, ip, id)
//Создает сокет и подключается к серверу, port=порт(double), ip=айпишник(string), id=айдишник сами назначаем(string).
//Работает с теми же серверными колбэками.

nodejs_net_socketPause(socket)
//Ставит сокет на паузу, при этом ивент "data" не будет вызываться.

nodejs_net_socketResume(socket)
//Снимает сокет с паузы.

nodejs_fs_readFileSync(file)
//Читает файл(string), возвращает текст, работает СИНХРОННО.

nodejs_fs_writeFileSync(file, data)
//Записывает текст(string) в файл(string), СИНХРОННО.

nodejs_fs_readFile(id, file)
// Читает файл АСИНХРОННО, id(string), file(string), прочитанные данные будут в argument1 (scr_nodejs_onFS)

nodejs_fs_writeFile(id, file, data)
// Записывает файл АСИНХРОННО, id(string), file(string), data(string), в argument1 будет "ok" (scr_nodejs_onFS)

nodejs_fs_appendFile(id, file, data)
// Присоединяет файл АСИНХРОННО, id(string), file(string), data(string), в argument1 будет "ok" (scr_nodejs_onFS)

nodejs_fs_appendFileSync(file, data)
// Присоединяет файл СИНХРОННО, file(string), data(string), вернет 0 в любом случае

nodejs_console_log(text)
//Выводит текст(string) в консоль электрона.

nodejs_sleep(ms)
//Задержка кода в миллисекундах(double).

nodejs_cr_createHash(str, hashtype)
//Возвращает хэш от str(string), тип хэша hashtype(string) может быть например указан так "md5",
//полный список типов:
//"DSA", "DSA-SHA", "DSA-SHA1", "DSA-SHA1-old", "RSA-MD4", "RSA-MD5", "RSA-MDC2", "RSA-RIPEMD160", "RSA-SHA", "RSA-SHA1", "RSA-SHA1-2", "RSA-SHA224", "RSA-SHA256", "RSA-SHA384", "RSA-SHA512", "dsaEncryption", "dsaWithSHA", "dsaWithSHA1", "dss1", "ecdsa-with-SHA1", "md4", "md4WithRSAEncryption", "md5", "md5WithRSAEncryption", "mdc2", "mdc2WithRSA", "ripemd", "ripemd160", "ripemd160WithRSA", "rmd160", "sha", "sha1", "sha1WithRSAEncryption", "sha224", "sha224WithRSAEncryption", "sha256", "sha256WithRSAEncryption", "sha384", "sha384WithRSAEncryption", "sha512", "sha512WithRSAEncryption", "shaWithRSAEncryption", "ssl2-md5", "ssl3-md5", "ssl3-sha1", "whirlpool"

nodejs_setTimeout(ms, arg1, arg2, arg3)
//Отложенный ивент, возвращает id(string), через ms(миллисекунды) выполнится скрипт scr_nodejs_onTimeout с тремя пользовательскими аргументами arg1, arg2, arg3 (все string).

nodejs_clearTimeout(id)
//Остановка отложенного ивента (см. выше) по id(string)

На работоспособность проверено, совместимо с GMS играми под Windows(из чего можно сделать вывод что node использует winsockets и с браузерными клиентами которые используют websokets просто так работать не будет).
Возможны баги и гавнокод.
Протестировано в "грязной" системе(не самый сильный процессор и куча всего запущенного), сервер переваривал около 25000 сообщений в сек., и отвечал на них, программа win GMS создавала 1000 сокетов и отправляла 'Hello' в цикле, через несколько минут производительность снижается, возможно из за того что клиент генерирующий нагрузку и сервер запущены на одном компе.
Прикреплённые файлы
* Nodejs4gm.7z (808.42 Кб - загружено 11 раз.)
Последнее редактирование: 20 Декабря 2016 в 13:43 от ELGReeN

 
Spartan121
Невыспавшийся
Завсегдатай
****

Репутация: 33
Offline Offline

Сообщений: 611


DragonGameStudios

Ответ № 1 06 Ноября 2016 в 13:23
Весьма даже ничего звучит, как думаешь, будет возможность совместить это с другими платформами?(iOS, например)
В принципе я для тестов и дебага использовал хром, но он черезвычайно топорный, на вин нашел порт сафари, но не проверял его на производительность еще(лелею надежды на то, что он будет так же силен, как на маке)

ELGReeN
Активный участник
**

Репутация: 8
Offline Offline

Сообщений: 122


Ответ № 2 06 Ноября 2016 в 13:53
А зачем кроссплатформенный сервер? ну это зависит от того работает ли node в electron-е на других ОС(скорее всего работает), просто проверить надо.
Если ты про совместимость с клиентами то должно завестись если на клиенте то же использовать node и electron, node не только в сервер может но и в клиент https://nodejs.org/api/net.html просто в расширение перемычку(nodejs4gm) добавить функции клиента.

Cross Platform
Compatible with Mac, Windows, and Linux, Electron apps build and run on three platforms.

iOS/и прочие клиенты на ГМе не WIN, не знаю как там сделана сеть в ГМе, может стандартный winsockets и тогда все ок.
Совместимость с websockets вопрос открытый (что бы все понимали, websokets это сокеты используемые в браузерах и они не совместимы с winsockets/sockets просто так без плясок с бубном, на офф форуме ГМа есть куча расширений js для websockets клиентов но нет не одного для сервера).
Может это пригодится:
https://github.com/websockets/ws/tree/master/lib
WebSocket.js
WebSocketServer.js
Последнее редактирование: 22 Ноября 2016 в 10:22 от ELGReeN

ELGReeN
Активный участник
**

Репутация: 8
Offline Offline

Сообщений: 122


Ответ № 3 06 Ноября 2016 в 16:01
Теперь о проблемах:
1) Если одновременно отключается много сокетов, ивент глючит и не срабатывает, в результате в списке сокетов будут находится не рабочие сокеты через которые не получится пересылать данные.
Костыль можно придумать такой, вручную иногда пинговать все и удалять не рабочие, и в логике предполагать что клиент уже отключен.

2) Склеивание сообщений и их фрагментация на обеих сторонах, это когда логически отправляется 2 отдельных сообщения, но приходят они уже в виде одного, или вместо одного приходят два. Причин тут может быть много, алгоритм нагла, сетевая железка где то по пути поломала для оптимизации.
Возможное решение, все входящие данные заранее сохранять в строку/буфер, и затем читать от туда по меткам начала и конца сообщения:
"%1hello%2%1he"
читаем и удаляем от первого %1 до первого %2(если они есть), к тому что осталось добавим следующее сообщение.
"%1he"+"llo%2" возможно есть решение поизящнее или готовые встроенные механизмы.

3) Это даже не проблема а особенность, такой сервер однопоточный(с недавних пор node можно в многоядерность но что нам с того если наша тяжелая логика все равно на одном ядре), что можно придумать:
Изначально новый клиент подключается на балансировщик, который знает какой из игровых серверов сейчас загружен меньше всех, и перенаправляет клиента на менее загруженный, игровые сервера могут быть на других компьютерах.
Другое решение это разбивать мир игры на локации и каждую выполнять на отдельном игровом сервере, допустим у нас есть 8 ядер процессора, делим мир на 3х3 или 3х2 локаций, либо 10х10++ если компьютеров(денег/бюджета) больше и вы делаете что то очень профессиональное.
Еще видел, уже не помню где, такое решение как динамические локации=кластеры, то есть мир игры так же разделен на локации=игровой сервер, но каждый такой сервер динамически изменяет свой размер локации в зависимости от того сколько человек на ней находится, остальные локации соответственно увеличиваются, благодаря этому те места где собирается много игроков не нужно разбивать на каналы или кого то отключать, ограничивать вход новых. Пример, есть мир 2х2 локации, в каждой максимальный онлайн без лагов 200, в одной скапливается 400(это может быть город, или ивент) в остальных 100, первая локация уменьшается в размерах, так что бы вместо 400 на ней были 200, остальные игроки не заметно для них перекидываются на остальные 3 локации которые увеличились. Такое решение самое трудное в реализации но и самое изящное.

Отдельная проблема это доступ к данным, появляется если игровая логика предполагает одновременный доступ к данным из нескольких игровых серверов(выполняющихся асинхронно).

4) Перебор объектов в цикле при большой карте, возможно это можно по другому решить(деактивация не всегда применима), но я додумался только до такого:
Предположим окно игры у игрока 1920х1080 в среднем, делим мир на квадраты 1000х1000(типа логические виртуальные тайлы оптимизации), в любое окно должно влезть 3х3 таких квадратов(супер мониторы не у всех есть, ими пренебрегаем), каждый раз когда любой объект перемещается, он сам проверяет а не попал ли он в новый квадрат, если так то вносим данные о себе в этот квадрат, а из старого удаляем, далее, объект которому нужно, вместо того что бы перебирать все объекты в мире(это могут быть деревья, которых овер100500к, instance_nearest не годится), перебирает все что есть в его квадрате +-1(область 3х3). (=Список объектов в грид с каждого большого тайла.)
Побочный эффект это предотвращение хаков в ммо, клиенту не нужно знать где находятся ВСЕ игроки, а только те кто в маленьком радиусе от него.
Последнее редактирование: 22 Ноября 2016 в 10:23 от ELGReeN

ELGReeN
Активный участник
**

Репутация: 8
Offline Offline

Сообщений: 122


Ответ № 4 21 Ноября 2016 в 16:07
Доработал:

При ошибке сокета и последующем отключении сокета не срабатывал колбэк scr_nodejs_onEnd, теперь работает, но все равно в консоль электрона сыпятся ошибки, это нормально.

Добавил логику проверки сокета (отключаемо), если от клиента долго(4сек) не приходило сообщений то он отключается, соответственно на стороне клиента нужно за этим следить и иногда что то присылать.

Добавил обработку входящих данных, теперь если пришло: частичное сообщение то оно сохранится и обработается когда придут остальные куски, если склееное сообщение то оно будет разделено и для каждого выполнится полезный код.
Однако есть еще вероятность получить куски в неправильном порядке, это пока не обрабатывается, потом, если такое вообще будет происходить.

Добавил новые функции:
nodejs_net_createConnection(port, ip, id)
Создает сокет и подключается к серверу, port=порт(double), ip=айпишник(string), id=айдишник сами назначаем(double, или можно в гмс выставить для этого аргумента string).
Работает с теми же серверными колбэками.
nodejs_fs_readFileSync(file)
Читает файл(string), возвращает текст, работает СИНХРОННО.
nodejs_fs_writeFileSync(file, data)
Записывает текст(string) в файл(string), СИНХРОННО.
nodejs_console_log(text)
Выводит текст(string) в консоль электрона.

Добавил проект источника нагрузки(что бы его запустить нужно скопировать папку электрона и в нее скомпилить источник нагрузки "электрон\resources\app", запуск так же через electron.exe уже из нового места).

Скрины:
№1 21000 сообщений в сек. туда-обратно.
№2 12000 сообщений в сек. туда-обратно.

Последнее редактирование: 22 Ноября 2016 в 10:24 от ELGReeN

Огион
Завсегдатай
****

Репутация: 123
Offline Offline

Сообщений: 940


Ответ № 5 22 Ноября 2016 в 00:35
броузеры
кэллбек
За что?
ELGReeN
Активный участник
**

Репутация: 8
Offline Offline

Сообщений: 122


Ответ № 6 22 Ноября 2016 в 09:03
броузеры
кэллбек
За что?
Что не так?
Обозреватель интернета
Обратный вызов

tolich
to ne lich
Ветеран форума
*****

Репутация: 213
Offline Offline

Сообщений: 1 478


moonlite

Ответ № 7 22 Ноября 2016 в 10:00
Ну, я не знаю. Может, потому, что браузер и колбэк?

ELGReeN
Активный участник
**

Репутация: 8
Offline Offline

Сообщений: 122


Ответ № 8 22 Ноября 2016 в 10:28
Ну, я не знаю. Может, потому, что браузер и колбэк?
Исправил, трудно запоминать как правильно писать специфические английские термины.

Огион
Завсегдатай
****

Репутация: 123
Offline Offline

Сообщений: 940


Ответ № 9 22 Ноября 2016 в 13:24
Слово «браузер» уже давно и прочно вошло в русский язык. А «call» — это базовое слово, которое должен знать третьеклассник.
ELGReeN
Активный участник
**

Репутация: 8
Offline Offline

Сообщений: 122


Ответ № 10 22 Ноября 2016 в 16:44
Слово «браузер» уже давно и прочно вошло в русский язык. А «call» — это базовое слово, которое должен знать третьеклассник.
В английском слове browser буква О, ну и буква А английская произносится как эй, так что логично было писать как слышится для слов которых раньше не было в словаре(хз, может и сейчас нет).

Добавил:

nodejs_net_socketEnd(socket)
Корректно закрывает сокет(string), оставшиеся в буффере данные досылаются, отправляет пакет FIN

nodejs_sleep(ms)
Задержка кода в миллисекундах(double)

После некоторого гугления оказалось что протоколы tcp-ip сами следят за целостностью и корректностью пакетов, поэтому немного облегчил скрипт проверки входящих сообщений.
Порядок в котором приходят пакеты может быть не правильным.
Отключил алгоритм нагла в электроне на сервере и источнике нагрузки, однако как, то же самое, проделать в чистой компиляции клиента для вин не понятно, может нельзя вовсе, это значит что разделять сообщения придется скриптом tm_().

Применил(так как оно для сервера не надо):
draw_enable_drawevent(false);
application_surface_draw_enable(false);
application_surface_enable(false);

Средний пинг теперь работает, по 10 последним пингам с одного сокета.

Убил мертворожденную draw_text-овую консольку c("text"), вместо нее есть адекватная nodejs_console_log("text") выводящая в консоль электрона.
Последнее редактирование: 22 Ноября 2016 в 18:56 от ELGReeN

Огион
Завсегдатай
****

Репутация: 123
Offline Offline

Сообщений: 940


Ответ № 11 22 Ноября 2016 в 22:43
В английском слове browser буква О, ну и буква А английская произносится как эй
Начнём с того, что в английском языке у каждой гласной буквы два варианта чтения: в закрытом и в открытом слоге. Сравни: fat [fæt] ‘жир’ и fate [feɪt] ‘судьба’, pet [pet] ‘питомец’ и Pete [piːt] (имя), sit [sɪt] ‘сидеть’ и site [saɪt] ‘участок’, not [nɔt] ‘нет’ и note [nəʊt] ‘записка’, cut [kʌt] ‘резать’ и cute [kjuːt] ‘милый’, myth [mɪθ] ‘миф’ и my [maɪ] ‘мой’. Кроме того, есть тьма-тьмущая мелких правил, например: «a» в словах, заканчивающихся на -all, читается как долгое «о»: call, ball, wall. Лучше даже не пытаться разобраться во всех этих правилах, а просто заучивать произношения слов, и со временем ты научишься интуитивно догадываться, как должно читаться незнакомое слово. Правда, это не спасёт тебя от исключений, которые в английском языке встречаются на каждом шагу…
ELGReeN
Активный участник
**

Репутация: 8
Offline Offline

Сообщений: 122


Ответ № 12 25 Ноября 2016 в 12:15
Обнаружилась бага, если во время нагрузки сервера, открыть пару сайтов в броузере, процесс сервера начинает сильно разбухать(гиг и больше со временем), сделал дамп посмотрел чего там, что это может быть?:
http://data3.floomby.com/files/share/25_11_2016/9/9BN0WZ19l0iH8JAZU1yUEQ.jpg
И оно странное, если отдельно что то качать, или нагрузить проц то все нормально.
Похоже что какой то конфликт с SeaMonkey.
Последнее редактирование: 25 Ноября 2016 в 13:18 от ELGReeN

ELGReeN
Активный участник
**

Репутация: 8
Offline Offline

Сообщений: 122


Ответ № 13 26 Ноября 2016 в 20:39
Все таки под нагрузкой пакеты могут фрагментироваться, поэтому нужно проверять сообщения полностью, пример обновлен после доработки и тестирования.
Сейчас проверяется и возвращается отдельное сообщение правильно, переваривается нормально:

Фрагментированность - если приходит только кусок сообщения, то он сохраняется и когда придет следующий пакет они соединятся и выполнится код, однако есть вероятность что следующий пакет не совпадет, и это случай "некорректное сообщение", это только теория, но на всякий случай если это будет происходить предусмотрено решение, подписывание сообщения его md5, конкретно:
Использовать вместо nodejs_net_socketWrite_ (это скрипт обертка для отправки сообщений) - nodejs_net_socketWrite_md5
и вместо tm (это скрипт отделяющий сообщения из буфера) - tm_md5
При их использовании производительность падает примерно на ~40%, поэтому пока в примере не используются.

Склеивание пакетов - происходит когда перегружена сеть, нормально разъединяются tm().

Мусор - есть вероятность получения мусорных пакетов или множества фрагментов пакетов которые не получилось склеить, оно будет копиться в буфере, что бы не было утечки памяти в скрипте колбэке scr_nodejs_onData есть это:
if string_length(ds_map_find_value(obj_control.sockets, argument0)) > 2048 { nodejs_net_socketEnd(argument0)} // Если после обработки, остаток в псевдо-буфере слишком большой, то возможно приходит слишком много мусора

Немного теории:
Если вдруг будет слишком много пакетов от клиента, то это баги клиентского софта, либо сетевые глюки, или злонамеренно, в любом случает это вызовет избыточную нагрузку процессора для всего лишь одного клиента, можно завести счетчик, к примеру определиться что клиентский софт не может отправлять больше 20 сообщений с сек., и если приходит больше то беспощадно его отключать, то же самое с размером сообщения или буфера в целом, перед вычленением его от туда поверить что он не больше определенного размера, иначе отключать.

Еще понадобится, после тестирования готового сервера, ограничить количество одновременно подключенных сокетов, количество уже подключенных можно взять так:
ds_map_size(obj_control.sockets)

Последнее тестирование примера дало такие результаты у меня: (все на localhost)
Подключено 10000 сокетов и 15000 сообщений в сек. - стабильно, примерный пинг 20-60мс.
Подключено 60 сокетов и 19200 сообщений в сек. - стабильно, примерный пинг 10-40мс.
Чем больше сообщений тем сильнее нагружается проц, и когда его не хватает(1фпс) разбухает процесс.
Чем больше сокетов тем меньше можно переваривать сообщений.
Это все без полезной логики в коде, что будет на готовом сервере зависит от сложности кода.

Новый скрипт колбэк, для отложенного выполнения кода:
//===== scr_nodejs_onTimeout
// Этот скрипт вызывается из расширения nodejs4gm.js при
// срабатывании тайм аута
// argument0 = text1
// argument1 = text2
// argument2 = text3

Новые функции:
nodejs_net_socketPause(socket)
//Ставит сокет на паузу, при этом ивент "data" не будет вызываться.
 
nodejs_net_socketResume(socket)
//Снимает сокет с паузы.

nodejs_cr_createHash(str, hashtype)
//Возвращает хэш от str(string), тип хэша hashtype(string) может быть например указан так "md5",
//полный список типов:
//"DSA", "DSA-SHA", "DSA-SHA1", "DSA-SHA1-old", "RSA-MD4", "RSA-MD5", "RSA-MDC2", "RSA-RIPEMD160", "RSA-SHA", "RSA-SHA1", "RSA-SHA1-2", "RSA-SHA224", "RSA-SHA256", "RSA-SHA384", "RSA-SHA512", "dsaEncryption", "dsaWithSHA", "dsaWithSHA1", "dss1", "ecdsa-with-SHA1", "md4", "md4WithRSAEncryption", "md5", "md5WithRSAEncryption", "mdc2", "mdc2WithRSA", "ripemd", "ripemd160", "ripemd160WithRSA", "rmd160", "sha", "sha1", "sha1WithRSAEncryption", "sha224", "sha224WithRSAEncryption", "sha256", "sha256WithRSAEncryption", "sha384", "sha384WithRSAEncryption", "sha512", "sha512WithRSAEncryption", "shaWithRSAEncryption", "ssl2-md5", "ssl3-md5", "ssl3-sha1", "whirlpool"
 
nodejs_setTimeout(ms, arg1, arg2, arg3)
//Отложенный ивент, возвращает id(string), через ms(миллисекунды) выполнится скрипт scr_nodejs_onTimeout с тремя пользовательскими аргументами arg1, arg2, arg3 (все string).
 
nodejs_clearTimeout(id)
//Остановка отложенного ивента (см. выше) по id(string)


ELGReeN
Активный участник
**

Репутация: 8
Offline Offline

Сообщений: 122


Ответ № 14 20 Декабря 2016 в 13:24
Добавил файлы main.js и package.json (для папки \resources\app), не обязательно использовать именно их, можно и стандартные.

main.js не стандартный, в нем есть следующее для предотвращения ухода системы в спящий режим:
const {powerSaveBlocker} = require('electron') //Block the system from entering low-power (sleep) mode.
const id_pwr_blk = powerSaveBlocker.start('prevent-app-suspension')

+ выключение возможности свернуть окно(так как в свернутом состоянии не работают события, хотя на сетевые запросы все равно отвечает)(это костыль, диспетчером задач все равно сворачивается):
 win = new BrowserWindow({width: 600, height: 500, x: 600, y: 0, offscreen: true, minimizable: false})

package.json стандартный.


Еще 4 файловых функций, и 1 колбэк:
scr_nodejs_onFS(id, data)
//===== scr_nodejs_onFS
// Этот скрипт вызывается из расширения nodejs4gm.js при
// окончании работы файловой функции, в аргументе0 будет его id (определенный вами)
// argument0 = ID
// argument1 = данные или статус выполнения

nodejs_fs_readFile(id, file)
// Читает файл АСИНХРОННО, id(string), file(string), прочитанные данные будут в argument1 (scr_nodejs_onFS)
nodejs_fs_writeFile(id, file, data)
// Записывает файл АСИНХРОННО, id(string), file(string), data(string), в argument1 будет "ok" (scr_nodejs_onFS)
nodejs_fs_appendFile(id, file, data)
// Присоединяет файл АСИНХРОННО, id(string), file(string), data(string), в argument1 будет "ok" (scr_nodejs_onFS)
nodejs_fs_appendFileSync(file, data)
// Присоединяет файл СИНХРОННО, file(string), data(string), вернет 0 в любом случае
Последнее редактирование: 20 Декабря 2016 в 13:42 от ELGReeN

Страниц: 1   Вверх
  Печать  
 
Перейти в:  

RSGMC (gmakers.ru) © 2007—2017
Счётчик–@Mail.ru