Передача данных по websocket

Реализация передачи данных по websocket выполнена при помощи библиотеки https://socket.io.

Примечание: символ ~/ будет означать корневой адрес

Шаг 1. Подключение библиотеки socket.io

<script src="~/socket.io/socket.io.js"></script>

Шаг 2. Инициализация соединения

var socket = io.connect('http://domain.com', {
path: '/virtaulPath' + '/socket.io',
transports: ['websocket']
});

, где

  • http://domain.com — корневой адрес сервиса
  • ‘/virtualPath’ — виртуальная директория, если есть, иначе String.Empty

Шаг 3. Регистрация пользователя на сервере.

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

socket.emit('rpc', {
namespace: 'PN',
action: 'shell',
method: 'getServerTime',
data: null,
token: 'текущий токен авторизации' // он и нужен нам
});

, где:

  • namespace: string — пространство имен, где хранятся удаленные процедуры. По умолчанию PN
  • action: string — имя области (действия)
  • method: string — имя метода
  • data: any — данные для обработки на сервере. Список элементов уточнять у разработчика методов.
  • token: string — токен авторизации. Его следует передавать каждый раз при выполнении запроса.

Примечание: полный перечень методов можно получить вызвав запрос GET ~/rpc/meta, который доступен авторизованным пользователям.

Далее подписываемся на событие ответа от сервера.

socket.on('PN.shell.getServerTime', function(obj) { // (1)
if(obj.code == 200) {
// (2) Регистрация прошла успешно
}
});

Имя события (1) на которое надо подписываться именуется из сложения строк.

var eventName = namespace + '.' + action + '.' + method;

Результатом ответа будет объект (2), который имеет следующую структуру:

  • meta: any — мета информация socket запроса
    • processed: boolean — если true, то значит операция завершена полностью, иначе требуется дожидаться следующего ответа.
    • status: string — строка со статусом выполнения операции
socket.io(evantName, function(obj) {
if(obj.meta.processed == false) {
// тут может отображаться статус выполнения операции
console.log(obj.meta.status);
} else {
// значит операция была завершена
}
});
  • data: any — содержит мету информацию выполнения RPC запроса
    • success: boolean — результат выполнения RPC — запроса
    • msg: string — текст сообщения
  • result: any — результат выполнения запроса
  • code: number — код выполнения
    • 200 — запрос выполнено удачно
    • 401 — не авторизован
    • 500 — ошибка выполнения

Шаг 4. Тестирование уведомлений

Подписываемся на соответствующее событие:

socket.on('notifiction', function(obj) {
if(obj.meta.processed == true) {
console.log(obj.result.title);
console.log(obj.result.message);
}
});

Для тестирования механизма уведомлений есть тестовый адрес:

GET ~/notification/test?username=[user]&message=[message];

, где:

  • username: string — логин пользователя
  • message: string — текст сообщения

В результате вызова запроса, обработчик должен его перехватить и вывести результат в консоли.

Print Friendly, PDF & Email

Добавить комментарий