Объект JCJSTcpClient это полнофункциональный асинхронный TCP клиент с поддержкой защищенного соединения.
В этом разделе перечислены свойства и методы объекта JCJSTcpClient плагина PluginNetwork
В JCJSTcpClient реализован протокол обмена jCjS,
гарантирующий неизменную доставку JS объектов между удаленными постами jCjS.
Для совместимости со сторонним ПО, предусмотрен режим raw.
Пример использования находится в каталоге stuff/tests/pluginNetwork/TCP_Srv
Пример использования:
// Загрузить плагин и Установить в 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"
// }