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

ДОСТУПНО ТОЛЬКО ПРИ ИСПОЛЬЗОВАНИИ Qt 5.
Для установки объекта в контекст JavaScript сборка jCjS должна содержать модуль QtWebSockets. В сборке с Qt 4 конструктор JCJSWebSocketServer отсутствует.

Объект JCJSWebSocketServer — асинхронный сервер стандартного протокола WebSocket. Поддерживаются открытый режим ws и защищённый режим wss. Объект доступен в контексте JavaScript при сборке jCjS с Qt 5 и модулем QtWebSockets.

Текстовое сообщение поступает в JavaScript как String, бинарное — как ByteArray. Значение socketDescriptor в сигналах и методах является идентификатором WebSocket-клиента и действительно только в течение его текущего соединения.

ВНИМАНИЕ!!! JCJSWebSocketServer не декодирует внутренний кадр протокола обмена jCjS. При использовании JCJSWebSocketClient для прямого соединения с этим сервером установите клиенту raw = true.


Свойства (property)

String webServer.listen_addr чтение/запись
Адрес интерфейса прослушивания, например 127.0.0.1, 0.0.0.0 или ::.


int webServer.listen_port чтение/запись
Порт прослушивания, 0–65535.


String Array() webServer.allAddresses только чтение
Список локальных IP-адресов.


bool webServer.isWork только чтение
Сервер запущен и принимает соединения.


VariantList webServer.clientDescriptors только чтение
Идентификаторы подключённых клиентов.


VariantList webServer.clientAddrs только чтение
Адреса подключённых клиентов.


int webServer.clientCount только чтение
Количество подключённых клиентов.


int webServer.maxPendingConnections чтение/запись
Максимальное количество ожидающих соединений.


int webServer.handshakeTimeout чтение/запись
Таймаут WebSocket handshake. Свойство доступно начиная с Qt 5.14.


quint32 webServer.maxFrameSize чтение/запись
Максимальный размер входного WebSocket-сообщения для каждого клиента. По умолчанию 67108864 (64 МБ), допустимый максимум 268435456 (256 МБ). Новое значение применяется и к уже подключённым клиентам.


bool webServer.ssl чтение/запись
Запустить сервер в защищённом режиме wss.


String webServer.mode только чтение
Текущий режим сервера: SSL либо без шифрования.


String webServer.sslProto только чтение
Протокол установленного TLS-сеанса либо UnknownProtocol.


String webServer.sslDir чтение/запись
Каталог с сертификатом и приватным ключом.


String webServer.sslCrtName чтение/запись
Общее имя файлов сертификата и ключа. Файлы с расширениями .crt и .key должны иметь одинаковое имя.


String webServer.sslKeyPass чтение/запись
Пароль приватного ключа.


bool webServer.ignoreSelfSignSsl чтение/запись
Разрешить игнорирование поддерживаемых ошибок самоподписанного сертификата у подключённого клиента.


Number webServer.inCount, outCount, inCountBytes, outCountBytes только чтение
Счётчики принятых/переданных сообщений и байтов.


Сигналы

void webServer.started()
Сервер успешно начал прослушивание.


void webServer.connected(Number socketDescriptor)
Подключился новый клиент.


void webServer.disconnected(Number socketDescriptor)
Клиент отключился.


void webServer.readyRead(Variant message, Number socketDescriptor)
От клиента принято полное текстовое или бинарное WebSocket-сообщение.


void webServer.error(Number socketDescriptor, String errorText)
Ошибка клиентского соединения.


void webServer.serverError(String errorText)
Ошибка WebSocket-сервера или код закрытия протокола.


void webServer.aboutToClose(Number socketDescriptor)
Клиентское соединение готовится к закрытию.


void webServer.readChannelFinished(Number socketDescriptor)
Канал чтения клиента закрыт.


void webServer.aTcp(int port), void webServer.rTcp(int port)
Служебные сигналы добавления и освобождения TCP-порта.


Методы

bool webServer.serverStart()
Создать сервер и начать прослушивание.


bool webServer.serverStop()
Закрыть клиентские соединения и остановить сервер.


bool webServer.serverStartStop()
Переключить состояние сервера.


bool webServer.isListening()
Проверить, выполняется ли прослушивание.


void webServer.sendAllClients(Variant message)
Отправить сообщение всем клиентам.


qint64 webServer.sendClient(Variant message, Number socketDescriptor)
Отправить сообщение указанному клиенту; возвращает число байтов либо 0.


bool webServer.removeClient(Number socketDescriptor)
Закрыть соединение с указанным клиентом.


void webServer.removeAllCliens()
Закрыть все клиентские соединения. Имя метода сохранено для совместимости.


String webServer.getPeerAddress(Number socketDescriptor)
Получить IP-адрес клиента.


String webServer.getSslProto(Number socketDescriptor)
Получить протокол TLS клиентского соединения.


Примеры

WebSocket echo-сервер:

post.loadPlugin('PluginNetwork').install(scriptEngine);

var webServer = new JCJSWebSocketServer();
webServer.listen_addr = '0.0.0.0';
webServer.listen_port = 8080;
webServer.maxFrameSize = 64 * 1024 * 1024;

webServer.started.connect(function() {
    post.log('i', 'WebSocket сервер запущен');
});
webServer.connected.connect(function(socketDescriptor) {
    post.log('i', 'Клиент: ' + webServer.getPeerAddress(socketDescriptor));
});
webServer.readyRead.connect(function(message, socketDescriptor) {
    webServer.sendClient(message, socketDescriptor);
});
webServer.disconnected.connect(function(socketDescriptor) {
    post.log('i', 'Клиент отключён: ' + socketDescriptor);
});
webServer.serverError.connect(function(text) {
    post.log('e', 'WebSocket сервер: ' + text);
});

if (!webServer.serverStart())
    post.log('e', 'Не удалось запустить WebSocket сервер');

Защищённый сервер wss:

var secureServer = new JCJSWebSocketServer();
secureServer.listen_addr = '0.0.0.0';
secureServer.listen_port = 8443;
secureServer.ssl = true;
secureServer.sslDir = 'cert';
secureServer.sslCrtName = 'server'; // cert/server.crt и cert/server.key
secureServer.sslKeyPass = 'private-key-password';
secureServer.serverStart();

Рассылка и отключение клиента:

webServer.sendAllClients('Сервер будет перезапущен');

var clients = webServer.clientDescriptors;
if (clients.length > 0)
    webServer.removeClient(clients[0]);