Первые шаги с помощью WebSocket и Node.js (и Socket.io)

Демонстрация отправки уведомлений на веб-страницу через WebSocket с Node.js в источнике, на сервере или локально.

Мы увидим, что с помощью WebSocket легко создать HTML-интерфейс 5 для локального приложения. Возможны и другие приложения, например, дистанционное управление роботом.

мы и выдаем

API socket.io содержит два метода обмена данными, которые работают на стороне клиента или на стороне сервера, emit и on. Для запуска соединения используются другие методы.

передал
Отправка данных. Параметр имеет такой код, как, например, «уведомление», а другая сторона реагирует на эту команду методом, который имеет такой же код.
Отвечает на отправку данных другой стороной и вызывает функцию, предоставленную в качестве параметра, для обработки этих данных .
подключение
Запускает соединение с сервером по запросу клиента. Она имеет имя сервера, по умолчанию его не ставят.
список
Создает прослушиватель (прослушиватель) - функцию, перехватывающую вмешательства клиента.

Сценарий интерфейса сначала создает объект сервера, затем объект socket.io, затем прослушиватель. Он отправляет HTML-страницу клиенту .

Веб-страница после отображения на стороне клиента создает объект сокета и устанавливает соединение:

var socket = io.connect();

socket.on('notification', function(x) { notification(x); });

Функция уведомления - это хэндлер, который ждет ответа от сервера и обрабатывает данные, которые отправляет сервер. В нашем примере обработка заключается в том, чтобы поместить полученные данные в слой, id которого является «хранением».

Сервер перехватывает запрос клиента с функцией on:

listener.sockets.on('connection', function (socket) { start(socket);} ); 

Он отвечает командой:

socket.emit('notification', 'Server online via socket!'); 

Все это происходит при загрузке страницы. Теперь посмотрим, как добиться реального взаимодействия пользователя и сервера.

Взаимодействие с сервером

Для реального взаимодействия необходимо, чтобы страница отправляла запрос на сервер по запросу пользователя и отображала данные, переданные сервером в ответ.

Чтобы продемонстрировать это, добавьте кнопку на страницу. Когда пользователь нажимает эту кнопку, выполняется функция JavaScript callserver.
Затем HTML-страница запускает обмен со сценарием на стороне сервера с помощью команды emit.

socket.emit('called', 'Nothing'); 

Сервер перехватывает запрос и в ответ на команду «called» отправляет новое сообщение. Это сообщение представляет собой набор данных в формате JSON, который мы представили здесь со строкой ':

socket.emit('notification', 'Yes still here! Want some data?');

На клиентской стороне всегда один и тот же хэндлер принимает данные и отображает содержимое.

socket.on('notification', function(x) { notification(x); });	

На практике содержание будет представлять собой набор ключей-значений, при этом ключи соответствуют, например, текстовым полям на HTML-странице, а значение - содержимому, которое должно отображаться на ней.

Вот полный исходный код обоих файлов...

Сценарий со стороны сервера, socket-mini.js

var uri="/socket-mini.html";
var fs = require('fs'),
    http = require('http'),
    socket = require("socket.io");

var page = fs.readFileSync(__dirname + uri);

function handler(request, response)
{
  response.write(page);
  response.end();
}
var app = http.createServer(function(r, s){ handler(r,s); });
app.listen(1000);
var listener = socket.listen(app, { log: false });

function start(socket)
{
  socket.emit('notification', 'Server online via socket!');
  socket.on('called', function(){
    console.log("Request received.");
    listener.sockets.emit('notification', 'Yes still here! Want some data?');
});
}
listener.sockets.on('connection', function (socket) { start(socket);} );

Для запуска сервера введите командную строку:

node socket-mini.js

Сервер отвечает только на два типа запросов: «connection» и «called», первый предварительно определен, второй создан нашей демонстрацией.
Можно создавать любое количество запросов. Если вы хотите избежать определения функции для каждой, вы можете поместить в данные, отправленные с помощью «called», массив типа ключ-значение, каждый ключ соответствует команде и каждое значение, предоставляющее параметры для нее.

Сценарий со стороны клиента, socket-mini.html

<!doctype html>
<html>
<head>
<meta charset=utf-8>
<title></title>
</head>
<script type="text/javascript" src="/socket.io/socket.io.js"></script>
<script type="text/javascript">
var socket = io.connect();

function notification(content)
{
  var x= document.getElementById("storage");
  x.innerHTML = content;
  console.log(content);
}

socket.on('notification', function(x) { notification(x); });

function callserver()
{
  socket.emit('called', 'Nothing');
}
</script>

<body>
<h1>Notification from server by socket.io</h1>
<fieldset><legend>Messages received</legend>
<div id="storage"></div>
</fieldset>

<form name="form1" method="post" action="">
<input type="button"  value="Call server" onClick="callserver()">
</form>
</body>
</html>

Эта страница отправляется сервером и отображается браузером при вводе URL-адреса браузера:

localhost:1000

Эта демонстрация ограничивается одной HTML-страницей, заданной в качестве параметра серверу и назначенной переменной uri (что достаточно для создания приложения с HTML-интерфейсом). Основываясь на предыдущих учебниках, в том числе «Как создать сервер страниц с Node.js», можно сделать его более общим и использовать разные HTML-страницы с одним и тем же серверным скриптом. Полную информацию об этом предоставляет Advanced Explorer в разделе «Сценарии».

Только нам интересны для этой статьи файлы socket-mini.html и socket-mini.js.