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

Объект JCJSTcpClient это полнофункциональный асинхронный TCP клиент с поддержкой защищенного соединения.

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

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


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


Свойства (property)


Объект JCJSTcpClient имеет общие свойства указанные в описательной части протокола обмена jCjS

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

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

// Создать объект, к свойствам и
// методам которого можно обращаться в стиле Qt
var tcpClient = new JCJSTcpClient();
//свойство параметра чтение/запись:
// Чтение
var compressor = tcpClient.compressor;
// Запись
var host = 'lesav.ru';
tcpClient.peerAddress = host;

int tcpClient.socketDescriptor только чтение
Дескриптор соединения

var socketDesc = tcpClient.socketDescriptor;


String tcpClient.localAddress только чтение
ip-адрес tcpClient-а

var locAddr = tcpClient.localAddress;


int tcpClient.localPort только чтение
Порт tcpClient-а

var locPort = tcpClient.localPort;


int tcpClient.peerAddress только чтение
ip-адрес сервера
возвращает ip-адрес сервера [ использовать после tcpClient.connectToServer(String serverName, int port) ]

var serv_addr = tcpClient.peerAddress;


int tcpClient.peerPort только чтение
Порт сервера
[ использовать после tcpClient.connectToServer(String serverName, int port) ]

var serv_port = tcpClient.peerPort;


String tcpClient.peerName только чтение
Имя сервера (используются службы разрешения имен DNS, WINS)

var serv_name = tcpClient.peerName;


bool tcpClient.isWork чтение

Статус соединения в режиме создания соединения или соединен

if(tcpClient.isWork)
{
    tcpClient.closeConnection();
}

bool tcpClient.isConnected чтение

Статус соединения в режиме соединен

if(tcpClient.isConnected)
{
    tcpClient.closeConnection();
}

bool tcpClient.forceConnect чтение/запись (по умолчанию false)

Переводит функцию connectToServer() в синхронный режим
Если true, то функция перестает быть асинхронной


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


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


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


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


Параметры, относящиеся к конфигурированию защищенного соединения

Для подключения клиента к серверу по защищенному каналу, необходимо сконфигурировать сервер в режим SSL.

bool tcpClient.ssl Чтение/запись

установить режим работы клиента

var ssl = tcpClient.ssl;  // текущий режим

tcpClient.ssl = true;     // Разрешить работы по SSL каналу

Если сервер подключен в режиме без шифрования, а клиент пытается подключиться в режиме SSL, то в логе клиента вы встретите уведомление

2015-02-06-11:11:29.182 +1 TCP_Cli_00: error=13: Error during SSL handshake: unknown protocol

В этом случае необходимо переключить сервер в режим защищенного соединения или отключить шифрование на стороне клинета.

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

2015-02-06-11:18:37.468 +1 TCP_Cli_00: error=1: The remote host closed the connection

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

Если сервер использует самоподписанные сертификаты, в логе можно встретить следующюю запись

2015-02-06-11:18:37.468 +1 error=13: The host name did not match any of the valid hosts for this certificate

В этом случае необходимо включить режим игнорирования ошибок ignoreSelfSignSsl (Внимание!!! Только в том случае, если вы доверяете серверу).


bool tcpClient.ignoreSelfSignSsl Чтение/запись
Игнорировать ошибки SSL, связанные с самоподписанными сертификатами

ВНИМАНИЕ!!! Это режим влияет на безопасность. Если злоумышленник подменит DNS запись сервера, то сможет направить ваши запросы на свой сервер.

var ignoreErr = tcpClient.ignoreSelfSignSsl;

tcpClient.ignoreSelfSignSsl = true;


String tcpClient.mode только чтение
возвращает текущий режим

ВНИМАНИЕ!!! Корректное состояние устанавливается после прохождения сигнала connected В обработчике сигнала connected корректное состояние текущего режима ждать не стоит.

var mode = tcpClient.mode;
/* Возвратит варианты:
   "без шифрования"
   "SSL клиент"
*/


String tcpClient.verifyMode Чтение/запись
Верификация удаленного сервера


int tcpServer.tcpVer только чтение
Используемая версия TcpIp
Отображается после установки соединения


String tcpClient.sslProto чтение/запись
установить необходимый протокол шифрования (по умолчанию SecureProtocols - максимально безопасный)

ВНИМАНИЕ!!! Устанавливать необходимй протокол шифрования следует перед connectToServer()



Сигналы

void tcpClient.readyRead(Variant message)

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

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

// =====================================
// следующее два тривиального примера: автоматически отправлять эхо-ответ
// 1
tcpClient.readyRead.connect(tcpClient.sendMessage);

// 2
//чтобы передать объект this в функцию обработчик
tcpClient.readyRead.connect(tcpClient,  function(mess){
    //    здесь   (this === tcpClient) =  true
    this.sendMessage(mess);
});

void tcpClient.connected() Сигнал

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

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

void tcpClient.disconnected() Сигнал

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

// подсоединить к сигналу disconnected функцию обработчик
tcpClient.disconnected.connect(function clientDisconnected(){
    post.log("i", 'Разрыв соединения с сервером')
});

void tcpClient.error(String) Сигнал

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

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

void tcpClient.protoSelfChange(newVer, oldVer) Сигнал

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

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


Методы

bool tcpClient.connectToServer(String serverName, int port) Функция
bool tcpClient.connectToServer(String serverNamePort) Функция

Подключиться к серверу

tcpClient.connectToServer('127.0.0.1', 8888);
// или
tcpClient.connectToServer('servName', 8888);
// или
tcpClient.connectToServer('127.0.0.1:8888');
// или
tcpClient.connectToServer('servName:8888');

void tcpClient.closeConnection() Функция

разъеденить соединение

tcpClient.closeConnection();

bool tcpClient.testRemotePort(String serverName, int port, int timeOut) Функция
bool tcpClient.testRemotePort(String serverNamePort, int timeOut) Функция

Проверить удаленный порт

if(tcpClient.testRemotePort('127.0.0.1', 8888, 500))
    post.log('i', 'Порт доступен');
else
    post.log('w', 'Порт не доступен');

bool tcpClient.isOpen() Функция

Статус соединения в режиме создания соединения или соединен

if(tcpClient.isOpen())
{
    tcpClient.closeConnection();
}

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

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

tcpClient.serverStartStop();

bool tcpClient.addRootCert() Функция

Добавить сертификат в локальную базу корневых сертификатов


// root_cert/ca.crt  сертификат всегда есть в локальной БД сертификатов
//  но если необходимо добавить сторонний сертификат, то указать полный путь к нему

var fullPathName2cert = server.getAbsPath( '../etc/ssl/root_cert/ca.crt');
if(!tcpClient.addRootCert(fullPathName2cert)) {
    // Не найден файл сертификата
}

bool tcpClient.waitForReadyRead(int ms) Функция

Ожидание поступления данных


bool tcpClient.waitForReadyLine(int ms) Функция

Ожидание поступления строки


void tcpClient.clientInfo() Функция
Информация о соединении ввиде объекта

post.log('w', 'cli: '+JSON.stringify(tcpClient.clientInfo()) );

// Выведет подробную информацию о соединении
// {
//   addr:          "10.7.97.218",
//   port:          18001,
//   sslAuth:       "RSA",
//   sslEncrypt:    "AESGCM(256)",
//   sslKeyExch:    "RSA",
//   sslProto:      "TLSv1_2"
// }