Описание объекта JCJSLocalServer плагина PluginNetwork

Объект JCJSLocalServer это полнофункциональный многопоточный асинхронный сервер обмена через именованные каналы (pipe)

В этом разделе перечислены свойства и методы объекта JCJSLocalServer плагина PluginNetwork

В JCJSLocalServer реализован протокол обмена jCjS, гарантирующий неизменную доставку JS объектов между постами jCjS в рамках одного хоста.
Для совместимости со сторонним ПО, предусмотрен режим raw.


Пример использования находится в каталоге stuff/tests/pluginNetwork/LOC_Srv


Свойства (property)


Объект JCJSTcpClient имеет общие свойства указанные в описательной части протокола обмена jCjS
ВНИМАНИЕ!!!, свойство protoSelf по умолчанию имеет значение 0

Пример использования:

// Загрузить плагин и Установить в JS конструторы объектов
post.loadPlugin('PluginNetwork').install(scriptEngine);

// Создать объект, к свойствам и
// методам которого можно обращаться в стиле Qt
var locServer = new JCJSLocalServer();
//свойство параметра чтение/запись:
// Чтение
var pipe_name = locServer.pipe_name;
// Запись
var pipe_name = 'pipe_name';
locServer.pipe_name = pipe_name;

bool locServer.isWork только чтение
возвращает текущее состояние сервера

if(locServer.isWork) {
    locServer.serverStop();
}


VariantList locServer.clientDescriptors только чтение

возвращает дескрипторы соединений

var clientDescriptors = locServer.clientDescriptors;

int locServer.clientCount только чтение

возвращает количество подключенных клиентов

var clientsCount = locServer.clientCount;

int locServer.maxClients Чтение/запись
Максимальное количество клиентов

var maxClients = locServer.maxClients;  // по умолчанию 30
locServer.maxClients = 1;               // ограничить одним соединением


String locServer.pipe_name Чтение/запись
Установить/прочитать имя канала (именованный канал)

var pipe_name = locServer.pipe_name;  // по умолчанию '', создается автоматически
locServer.pipe_name = 'pipeName';     // Изменить имя
if(locServer.serverStart())
    post.log("i", "Server started  pipe://" + locServer.pipe_name);
else
    post.log("e", "Server not started");
//----------------------------------------------
// равнозначно следующей записи
if(locServer.serverStart('pipeName'))
    post.log("i", "Server started  pipe://" + locServer.pipe_name);
else
    post.log("e", "Server not started");


String locServer.pipe_fullName только чтение
Прочитать полное имя канала (именованный канал)


bool locServer.worldAccess Чтение/запись
Разрешить подключаться клиентам без привелегий (по умолчанию false)


int locServer.intrval чтение/запись
Интервал чтения из сокета


bool locServer.raw чтение/запись
Включение raw режима (по умолчанию выключен)


quint8 locServer.stopChar чтение/запись
В режиме raw: Символ конца приемной посылки (по умолчанию 0 - выключен)


String locServer.stopWord чтение/запись
В режиме raw: Слово конца приемной посылки (по умолчанию '' - выключен)
stopChar более приоритетнее чем stopWord



Сигналы

void locServer.readyRead(Variant message, int socketDescriptor)

генерируется объектом JCJSLocalServer при успешном приеме сообщения

// подсоединить к сигналу readyRead функцию обработчик
locServer.readyRead.connect(function messageRead(mess, socketDesc){
    post.log("i", 'Клиент прислал сообщение: ' + JSON.stringify(mess) + '  дескриптор соединения=' + socketDesc)
});
// эквивалентно следующей конструкции
function messageRead(mess, socketDesc){
    post.log("i", 'Клиент прислал сообщение: ' + JSON.stringify(mess) + '  дескриптор соединения=' + socketDesc);
}
locServer.readyRead.connect(messageRead);

// следующей тривиальной строкой можно автоматически отправлять эхо-ответ
locServer.readyRead.connect(locServer.sendClient);

void locServer.connected(int socketDescriptor) Сигнал

генерируется объектом JCJSLocalServer при успешном подсоединении клиента к серверу

// подсоединить к сигналу connected функцию обработчик
locServer.connected.connect(function clientConnected(socketDesc){
    post.log("i", 'Есть новое соединение:  дескриптор соединения=' + socketDesc)
});

void locServer.disconnected(String addr, int port, int socketDescriptor) Сигнал

генерируется объектом JCJSLocalServer при разъединении соединения с клиентом

// подсоединить к сигналу connected функцию обработчик
locServer.disconnected.connect(function clientDisconnected(socketDesc){
    post.log("i", 'Клиент отключился: дескриптор соединения=' + socketDesc)
});

void locServer.error(String error, int socketDescriptor) Сигнал

генерируется объектом JCJSLocalServer при ошибках в сокете

// подсоединить к сигналу connected функцию обработчик
locServer.error.connect(function error(err, socketDesc){
    post.log("i", 'Ошибка: err=' + err + '  дескриптор соединения=' + socketDesc)
});

void locServer.protoSelfChange(int socketDescriptor, newVer, oldVer) Сигнал

генерируется объектом JCJSLocalServer если в процессе обмена протокол был изменен

locServer.protoSelfChange.connect(function protoSelfChange(d, newVer, oldVer){
    if(newVer === 0 && oldVer > 0) {
       post.log('w',  'было понижение версии. Встроенное шифрование crypt отключено');

       post.log('w', 'cli ' + d + ': '+JSON.stringify(locServer.clientInfo(d)) );
    }
});


Методы

Date locServer.serverWorkTime() Функция

Время работы сервера

var serverWorkTime = locServer.serverWorkTime();

bool locServer.serverStart(String pipeName = '') Функция

Запустить сервер на канале с именем pipeName

Если имя не задавать, оно будет сгенерировано

if(locServer.serverStart())
    post.log("i", "Server started  pipe://" + locServer.pipe_name);
else
    post.log("e", "Server not started");

bool locServer.serverStop() Функция

Остановить сервер

locServer.serverStop();

bool locServer.serverStartStop() Функция

поменять статус сервера на противоположный

locServer.serverStartStop();

void locServer.removeAllCliens() Функция

отключает всех клиентов
(у каждого подключенного клиента сгенерируется сигнал разрыва соединения)

locServer.removeAllCliens();

void locServer.sendAllClients(String mess) Функция

отправить всем подключенным клиентам сообщение

locServer.sendAllClients('Сообщение для всех подключенных');

void locServer.sendClient(const QString &mess, int socketDescriptor) Функция

отправить сообщение клиенту по дескриптору соединения

locServer.readyRead.connect(function messageRead(mess, socketDesc){
    post.log("i", 'Клиент прислал сообщение: ' + JSON.stringify(mess) + '  дескриптор соединения=' + socketDesc);
    locServer.sendClient('Сообщение для клиента, приславшего сообщение', socketDesc);
});

// равноценно следующей записи, но передается объект this в функцию обработчик
locServer.readyRead.connect(locServer, function messageRead(mess, socketDesc){
    post.log("i", 'Клиент прислал сообщение: ' + JSON.stringify(mess) + '  дескриптор соединения=' + socketDesc);
    //    здесь   (this === locServer) =  true
    this.sendClient('Сообщение для клиента, приславшего сообщение', socketDesc);
});

void locServer.getClient(int socketDescriptor) Функция

взять у сервера объект соединения по дескриптору соединения

locServer.readyRead.connect(locServer, function messageRead(mess, socketDesc){
    post.log("i", 'Клиент прислал сообщение: ' + JSON.stringify(mess) + '  дескриптор соединения=' + socketDesc);
    //    здесь   (this === locServer) =  true
    this.sendClient('Сообщение для клиента, приславшего сообщение', socketDesc);
});

// равноценно следующей записи, но запрашивается объект соединения
locServer.readyRead.connect(locServer, function messageRead(mess, socketDesc){
    post.log("i", 'Клиент прислал сообщение: ' + JSON.stringify(mess) + '  дескриптор соединения=' + socketDesc);
    //    здесь   (this === locServer) =  true
    var cli = this.getClient(socketDesc);
    cli.sendMessage('Сообщение для клиента, приславшего сообщение');
});