WebSockets

Материал из Course Orchestra
Перейти к: навигация, поиск

Протокол WebSocket предназначен для решения любых задач и снятия ограничений обмена данными между браузером и сервером. Он позволяет пересылать любые данные, на любой домен, безопасно и почти без лишнего сетевого трафика. На платформе Showcase реализован обмен текстовыми данными между клиентом (js-скрипты) и сервером.

Вводная теория

Для открытия соединения достаточно создать объект WebSocket, указав в нём специальный протокол ws:

var socket = new WebSocket("ws://javascript.ru/ws");

У объекта socket есть четыре коллбэка: один при получении данных и три – при изменениях в состоянии соединения:

socket.onopen = function() {
  alert("Соединение установлено.");
};

socket.onclose = function(event) {
  if (event.wasClean) {
    alert('Соединение закрыто чисто');
  } else {
    alert('Обрыв соединения'); // например, "убит" процесс сервера
  }
  alert('Код: ' + event.code + ' причина: ' + event.reason);
};

socket.onmessage = function(event) {
  alert("Получены данные " + event.data);
};

socket.onerror = function(error) {
  alert("Ошибка " + error.message);
};

Для посылки данных используется метод socket.send(data). Переслать строку можно следующим способом:

socket.send("Привет");


Реализация на Showcase

Вэбсокеты в Showcase реализованы следующим образом. Для начала в корень папки пользовательских данных необходимо положить файл websockets.xml следующего содержания:

<?xml version="1.0" encoding="UTF-8"?>
<websockets>
	<websocket proc="testtemplates.proc1.doRun1.cl" refreshInterval="10000" />
	<websocket proc="testtemplates.proc2.doRun2.cl" refreshInterval="-1" />
</websockets>

Каждый xml-элемент <websocket> содержит два обязательных атрибута. В атрибут proc прописывается имя челеста-процедуры, результатом выполнения которой будут данные, передаваемые на клиента. Атрибут refreshInterval содержит интервал времени (в миллисекундах), через который будет осуществляться повторный вызов челеста-процедуры. Если интервал имеет отрицательное значение, повторного вызова процедуры осуществляться не будет. Простейший пример кода челеста-процедуры:

# coding: utf-8

from ru.curs.showcase.core.jython import JythonDTO

def doRun1(context):
    dData = u'hello1'
    return JythonDTO(dData, None)

На клиенте сначала необходимо открыть вэбсокет вызовом:

var webSocket = new WebSocket(protocol+"://"+window.location.host+window.location.pathname+"secured/ws");

Url вэбсокета /secured/ws жёстко установлен!

Для генерации вызова челеста процедуры необходимо прописать вызов js-функции

socket.send("proc1");

Здесь proc1 это имя py-файла, в котором хранится челеста-код процедуры.

Для остановки повторного вызова челеста-процедуры необходимо прописать следующий js-код:

socket.send("stopProc1");

Здесь Proc1 в посылаемом сообщении имеет тот же смысл, что и выше.

Полный пример клиентского кода выглядит следующим образом:

         var protocol;
		if(window.location.protocol.indexOf("https") > -1){
			protocol = "wss";
		} else {
			protocol = "ws";
		}
		
	var webSocket = new WebSocket(protocol+"://"+window.location.host+window.location.pathname+"secured/ws");
	 
	//var webSocket = new WebSocket("ws://localhost:8484/Showcase/secured/ws");

	webSocket.onmessage = function(evt) { alert(evt.data); }; 
	 
	 webSocket.onopen = function() {
		  alert("Соединение установлено.");
		  webSocket.send("proc1");
		  webSocket.send("proc2");
		  setTimeout(webSocket.send("stopProc1"), 5000);
		};

	webSocket.onclose = function(event) {
		  if (event.wasClean) {
		    alert('Соединение закрыто чисто');
		  } else {
		    alert('Обрыв соединения'); // например, "убит" процесс сервера
		  }
		  alert('Код: ' + event.code + ' причина: ' + event.reason);
		};

	webSocket.onerror = function(error) {
			  alert("Ошибка " + error.message);
			};