Быстрый старт socket.io

Разработка серверной части

Модули Express и Socket.IO не входят в Node.js. Они являются внешними
зависимостями, которые должны быть загружены и установлены отдельно. Менеджер
пакетов Node.js (npm) сделает это за нас при запуске команды . То
же самое он сделает со всеми зависимостями, перечисленными в файле
. Файл вы можете найти в корневой директории
проекта. Он содержит определяющий зависимости проекта JSON-объект:

Файл index.js в корневой директории проекта — это точка входа для всего
приложения. Первые несколько строк инициализируют все необходимые модули.
Express настроен для обеспечения доступа к статическим файлам, а модуль
Socket.IO настроен так, чтобы отслеживать подключения к тому же порту,
что и Express. Следующие строки — основа приложения, необходимая
для работы сервера.

Весь код серверной части игры вынесен в отдельный файл agxgame.js. Этот
файл подключается в приложение в качестве модуля Node с помощью следующего
фрагмента кода: . Когда клиент подключается к
приложению с помощью Socket.IO, модуль должен выполнять функцию
. За это отвечает следующий фрагмент кода:

Функция в модуле также добавит слушатель событий:

Здесь — это объект, созданный с помощью Socket.IO, чтобы
инкапсулировать взаимодействие относительно уникального подключения через
сокет между сервером и браузером. Функция добавляет слушатель для
определенного события и привязывает к нему функцию. Когда браузер передает
событие через веб-сокет, библиотека Socket.IO
вызывает функцию . Имена событий и функций не
обязательно должны быть такими, мы назвали их так для наглядности.

Настроим uwsgi для работы Flask приложения с виртуальным окружением

Установим uwsgi

$ apt-get install uwsgi

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

Ссылки на статьи:

  1. http://uwsgi.readthedocs.io/en/latest/WSGIquickstart.html официальня документация

  2. http://killtheyak.com/serve-flask-with-uwsgi-nginx/ хорошая статья для простых случаев

  3. https://the-bosha.ru/2017/01/04/zapusk-flask-prilozheniia-c-uwsgi-virtualenv-i-nginx/ запуск Flask приложения c uWSGI, virtualenv и nginx

Step 3: Installing Socket.io Into Your Express Application

First, a quick summary of what Socket.io is. Socket.io is a real-time JavaScript library. In short, it’s a WebSocket API that will determine the correct type of connection to make depending on the browser’s capabilities, whether it be AJAX Long Polling, Flash, or even just plain WebSockets.

So how do you get started with this? First you need a Socket.io server. We already have an Express server ready and waiting, all we need to do is add on the socket library. To do that we have to add it to the file.

Your initial file might look something like this:

Now add a new field to the “dependencies” area:

Your resulting file should look something like this:

Now run once more to install the socket library.

Компилируем свой модуль для uWSGI

Установим необходимые библиотеки

$ apt-get install python3.6 python3.6-dev gcc
$ apt-get install uwsgi-src

Переходим в папку с виртуальным окружением

$ cd <project_env>/bin
$ uwsgi --build-plugin "/usr/src/uwsgi/plugins/python python36"

Возможные ошибки и их решение

fatal error uuiduuid.h
$ apt-get install uuid-dev

fatal error syscapability.h
$ apt-get install libcap-dev

fatal error opensslconf.h
$ apt-get install libssl-dev

fatal error pcre.h
$ apt-get install libpcre3-dev

Если все скомпилировалось, то мы увидим в консоли следующий вывод

 uwsgi --build-plugin "/usr/src/uwsgi/plugins/python python36"
*** uWSGI building and linking plugin from usrsrcuwsgipluginspython ***
x86_64-linux-gnu-gcc -pthread python36_plugin.so
build time 4 seconds
*** python36 plugin built and available in python36_plugin.so ***

Скомпилированный файл в той же папке. Его надо переместить в директорию с плагинами

$ mv python36_plugin.so usrlibuwsgiplugins

Задать права 644

sudo chmod 644 usrlibuwsgipluginspython36_plugin.so

Тестовый запуск интерпретатора

$ uwsgi --plugin python36 -s 

Если все работает мы увидим:

*** Starting uWSGI 2.0.12-debian (64bit) on Mon Nov 13 151754 2017 ***
compiled with version: 5.4.0 20160609 on 31 August 2017 21:02:04
os: Linux-4.4.0-93-generic #116-Ubuntu SMP Fri Aug 11 21:17:51 UTC 2017
nodename: RADIUS
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 8
current working directory: <yor_project>
detected binary path: /usr/bin/uwsgi-core
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** 
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 15645
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to TCP address :44816 (port auto-assigned) fd 3
Python version: 3.6.3 (default, Oct  4 2017, 02:55:45)  GCC 5.4.0 20160609
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x201e230
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 72768 bytes (71 KB) for 1 cores
*** Operational MODE: single process ***
*** no app loaded. going in full dynamic mode ***
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI worker 1 (and the only) (pid: 10618, cores: 1)

Проблема №1 — авторизация

Представим что Вы сделали авторизацию и личные кабинеты на вашем сайте. И вот подходит момент когда пора писать “Диалоги”. Первым делом Вы устанавливаете node.js и модуль socket.io, пишете server-side для “Диалогов”.

12345
var io = require('socket.io').listen(8080);io.set('log level', 1);io.sockets.on('connection', function (socket) {    ????????});

Тут и появляется вопрос… Как же идентифицировать нашего авторизованного через PHP пользователя в Node.js? Ведь у него есть вполне определённый id. Но как нам его получить. В большинстве случаев, для этого используются cookies. Они служат своего рода указателями на php-сессию хранимую на сервере.

Идея первая (ошибочная)

Сразу всплывает вариант получить cookies и с помощью них получить php-сессию. К сожалению, решения я не нашёл. Даже не предполагаю, что такое возможно.

Идея вторая

Идея заключается в том, чтобы хранить сессии не native-методом, а, например, в базе или memcached, или redis. Соглашусь что решение элегантное. Но давольно-таки сложное для новичков. Используя его всплывёт ряд проблем: установка и настройка хранилища сессий и конечно же сериализация сессий на стороне PHP (все сохраняемые сессии автоматически сериализуются и требуют десериализации после их получения). Одно из таких решений представлено здесь: Integrating Node.js with PHP. И ещё презентация с парой схем и полезными ссылками.

Идея третья (простая)

По неизвестным мне причинам, в интернете ничего похожего не нашёл. Идея заключается в том, чтобы (утрирую) “спросить у PHP авторизован ли у тебя пользователь с таким вот cookie 1234?”. Для этого мы воспользуемся “аналогом cURL для Node.js” — requestify. Систаксис этого модуля схож с ajax запросами в jQuery. С помощью него мы будем посылать запрос PHP, подделывая кукисы на кукисы пользователя. Модуль Socket.io имеет встроенную функцию авторизации, что значительно упрощает нам жизнь.

1234567891011121314151617181920212223242526272829303132333435363738
var requestify = require('requestify');var io = require('socket.io').listen(8080);io.set('log level', 1);io.configure(function(){    io.set('authorization', function(handshakeData, callback) {        requestify.get('http://example.com/ajax/get_user_array', {            dataType: 'json',            headers: {                'Cookie': handshakeData.headers,                'User-Agent': handshakeData.headers,                'X-Requested-With': 'XMLHttpRequest'            }        }).then(function(response) {            var user = JSON.parse(response.getBody());            handshakeData.user = user;            callback(null, true);        }, function(err){            callback(null, false);        });    });});io.sockets.on('connection', function (socket) {    var user = socket.handshake.user;    socket.join(user.id);    socket.on('disconnect', function() {        socket.leave(user.id);    });});

Метод get_user_array() в PHP:

1234567891011
function get_user_array() {    $user = Auth::instance()->get_user();    if(!$user)        throw new HTTP_Exception_404('File not found!');    $user = array(        'id' => $user->id,        'username' => $user->username,        'email' => $user->email,    );    echo json_encode($user);}

Если пользователь не авторизован — возвращется 404. В противном случае возвращется json-массив с информацией о пользователе.

EXPRESS

Почему именно этот фреймворк?

При своей минималистичности и легкости он предлагает весь необходимый набор функций для веб-приложения.

Чтобы создать каркас приложения при помощи этого фреймворка, можно использовать генератор приложений Express.

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

Генератор Express — это одна из возможностей создания приложения с использованием Express.

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

Никто не даст вам конкретных указаний о том, что и как именно нужно сделать. Структура директории, количество файлов, подключаемые внешние модули: выбор остается за вами.

Теперь посмотрим, как все описанное выше реализуется на примере.

Проблема: время реакции при обмене данными между сервером и клиентом

Интернет создавался главным образом на основе так называемой парадигмы запросов и ответов, реализованной с помощью протокола HTTP. Она заключается в том, что пока клиент не отправит запрос на открытие следующей страницы, она не загрузится. Примерно с 2005 г. с появлением технологии AJAX работа в Интернете стала более динамичной. При этом обмен данными по протоколу HTTP все равно инициировался клиентом, и это требовало от пользователя выполнения определенных действий или периодического опроса сервера для загрузки обновленной информации.

Технологии, позволяющие серверу отправлять клиенту новые данные в момент их появления, существуют довольно давно. Они известны как Push или Comet. Один из распространенных способов создания иллюзии соединения, инициируемого сервером, – это так называемый метод длинного опроса. Его суть в том, что клиент создает подключение к HTTP-серверу и оно не закрывается до отправки ответа. Если на сервере действительно есть обновленные данные, он отправляет ответ (в других технологиях для этого используются Flash, multipart-запросы XHR и особые HTML-файлы). Технология длинного опроса, как и другие подобные приемы, прекрасно работает. Вы пользуетесь ими каждый день, например, в чате Gmail.

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

What are WebSockets?

WebSockets are quite an interesting technology in and of itself. Let’s take a closer look at what it is.

WebSocket definition

WebSockets API is a technology providing a bidirectional communication channel between a client and a server. That means that the client no longer needs to be an initiator of a transaction while requesting data from both the server and database.

How do WebSockets work?

Typically, the client requests data starting a new connection and then the client loses connection. The server sending data also only has connection during the exchange. With WebSockets, during the first request to the backend server, except receiving incoming data, the socket.io client also establishes an initial connection. This process is known as the WebSocket handshake. The Upgrade header is included in the request. That’s how the client connected informs the server that it needs to create a connection.

Installation

Press enter until you see success message.

Create server directory and change it to server.
Then, initiate project with npm.

Then install node, express and socket

“concurrently” will run your client/server at dev.

Then create-react-app with dir name client.

“socket.io-client” is a client-side lib for Socket.IO.

Lastly, we need to add som script to run our two servers(node/express chat server and React client-side server).

server/package.json

Add scripts for running two servers concurrently.

At this point, you can test your React app with following command:

If you go to “http://localhost:3000”, you will see React icon spinning with dark grey background.

Сообщение

Для сообщений это тот же принцип!

chat.js:

app.js:

Для события new_message вы можете видеть, что мы вызываем свойство sockets для io. Он представляет все подключенные розетки. Таким образом, эта строка фактически отправит сообщение всем сокетам. Мы хотим, чтобы это показывало сообщение, отправленное пользователем всем (и само по себе).

Вот окончательный результат нашего чата:

Для крутости нашего приложения добавим некоторые улучшения, теперь когда кто то будет печатать сообщение мы увидим это

Добавить это будет легко:

После добавления элемента HTML в наш index.ejs мы просто добавляем прослушиватель событий jQuery при вводе и отправляем событие сокета с именем typing.

С другой стороны, мы слушаем набор текста и транслируем сообщение. Вещание означает отправку сообщения всем, кроме сокета, который его запускает.

Давайте добавим цвета к пользователям

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

После рефакторигнга получится такой результат:

Заключение

Видите, это приложение действительно легко кодировать. До того, как я узнал о существовании WebSockets и socket.io, я думал, что такого рода приложения действительно сложно кодировать!Чтобы улучшить это приложение, вот список функций, чтобы добавить:

  • Система регистрации с возможностью общаться в чате один-на-один
  • История всех разговоров
  • Онлайн / оффлайн метки
  • Скопируйте все функции WhatsApp!

ЧТО ТАКОЕ NODE.JS?

Каждый программист ответит по-своему на вопрос о том, какой язык лучше использовать для серверной части. В каждом случае сыграют роль накопленный опыт работы, привычка, особенности разрабатываемого продукта.

Согласно статистике использования Node.js для веб-сайтов, доля применения платформы стабильно увеличивается :

  • При помощи Node.js, можно создавать практически любые веб-приложения , кроме, разве, сложных вычислений. Хотя сложные вычисления всегда можно сделать на другом языке, а потом предоставить эти данные для использования и манипулирования ими уже на JavaScript. Но мы сейчас говорим о простом приложении.
  • Специфической областью применения платформы Node.js является микросервисная архитектура. То есть Node.js оптимально использовать для приложений, которые разбиты на небольшие модули (лента новостей, чат, магазин и т.д.). При этом каждый модуль не зависит друг от друга, но все вместе они составляют единую структуру.
  • Дополнительное преимущество заключается в том, что вокруг Node.js образовалось развитое сообщество . Благодаря этому доступна хорошая документация, а также существует большое количество готовых примеров для использования, фреймворков и библиотек, которые позволяют облегчить и ускорить разработку.

Согласитесь, неразумно отказываться от предлагаемых возможностей в виде готовых решений и писать код полностью вручную. Это сложно, долго, нерационально. Тем более, что мы говорим о простом приложении, а не о чем-то сложном и уникальном.

В сети предлагается множество пошаговых инструкций, которые подробно описывают создание веб-приложения при помощи Node.js. Какие-то из них рассчитаны на подготовленных разработчиков, мы же предлагаем рассмотреть простой пример разработки на Node.js для начинающих программистов и для тех, кто не силен в программировании, но кому интересна логика процесса.

README

Features

Socket.IO enables real-time bidirectional event-based communication. It consists of:

  • a Node.js server (this repository)

Some implementations in other languages are also available:

Its main features are:

Reliability

Connections are established even in the presence of:

  • proxies and load balancers.
  • personal firewall and antivirus software.

Disconnection detection

A heartbeat mechanism is implemented at the Engine.IO level, allowing both the server and the client to know when the other one is not responding anymore.

That functionality is achieved with timers set on both the server and the client, with timeout values (the and parameters) shared during the connection handshake. Those timers require any subsequent client calls to be directed to the same server, hence the requirement when using multiples nodes.

Multiplexing support

In order to create separation of concerns within your application (for example per module, or based on permissions), Socket.IO allows you to create several , which will act as separate communication channels but will share the same underlying connection.

Room support

Within each , you can define arbitrary channels, called , that sockets can join and leave. You can then broadcast to any given room, reaching every socket that has joined it.

This is a useful feature to send notifications to a group of users, or to a given user connected on several devices for example.

How to use

The following example attaches socket.io to a plain Node.JS
HTTP server listening on port .

In conjunction with Express

Starting with 3.0, express applications have become request handler
functions that you pass to or instances. You need
to pass the to , and not the express application
function. Also make sure to call on the , not the .

In conjunction with Fastify

To integrate Socket.io in your Fastify application you just need to
register plugin. It will create a
called .

Testing

This runs the task . By default the test will be run with the source code in directory.

Set the environmental variable to to test the transpiled es5-compat version of the code.

The task will always transpile the source code into es5 and export to first before running the test.

(LICENSE)

Что такое технологии веб-разработки

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

Здесь поговорим про интерфейсные и серверные технологии.

Давайте сначала определим каждый из этих терминов.

Front-end (интерфейсные) технологии

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

Back-end (серверные) технологии

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

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

Вы также можете отправлять автоматические электронные письма группам пользователей. Электронные письма могут быть отправлены в определенные даты, например, по истечении срока действия бесплатной пробной версии веб-сайта пользователя.

Первые две технологии, которые мы обсудим, – это интерфейсные технологии.

Как подружить uwsgi Flask socketio

Будь у меня веб-приложение все мои страдания на этом бы закончились. Но я же использую Flask-Socketio.

Так как я использую

socketio.init_app(app, async_mode='eventlet')

Необходимо в manage.py применить патч, чтобы сделать приложение асинхронным

import eventlet
eventlet.monkey_patch()

Если используется

socketio.init_app(app, async_mode='gevent')

Необходимо в manage.py применить патч, чтобы сделать приложение асинхронным

from gevent import monkey
monkey.patch_all()

Об этом можно узнать из официальной документации

Ошибка возникала следующая

RuntimeError You need to use the eventlet server. See the Deployment section of the documentation for more information.
RuntimeError You need to use the gevent server. See the Deployment section of the documentation for more information.

При этом у меня работал или веб-сервер или socketio, закономерности я не выявил. При этом при запуске приложение на Flask работало без замечаний.

Полезная подсказка на stackowerflow https://stackoverflow.com/questions/45035647/flask-socketio-uwsgi-causes-typeerror-socketio-object-is-not-callable

В итоге я понял следующее, чем, в принципе, и хотел поделиться.

  1. SocketIO полноценный сервер, который запускается на отдельном порту и не может работать через uwsgi. Поскольку WSGI не поддерживает WebSocket. Через uwsgi только longpooling а не websockets.
  2. Единственный вариант работы Flask — SocketIO — uWSGI это использовать gevent. И проксирование через TCP, а не через unix socket. При этом моё веб приложение не работает.
  3. В статьях рекомендуют для целей SocketIO использовать eventlet. Eventlet — это отдельный веб сервер, так что uwsgi не подходит. Что то одно — или eventlet или gevent/uwsgi.

Таким образом если используется uwsgi: единственный вариант, настроить nginx как прокси для отдельного сервера с соответствующими своими заголовками, запускать вебсокет приложение отдельно, а вебсайт отдельно. Общение между ними осуществлять через брокер сообщений RabbitMQ например.

Полезная страница в которой советуют использовать gunicorn для моей ситуации.
https://github.com/miguelgrinberg/Flask-SocketIO/issues/429 — Мигель Гринберг отвечает
Так же есть статья в которой сравниваются eventlet и gevent, к сожалению не могу найти.

Использование брокера RabbitMQ

Если вы не хотите пользоваться встроенным брокером, а хотите подключить полноценный, то в зависимости Maven надо добавить:

<!-- RabbitMQ Starter Dependency -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

<!-- Following additional dependency is required for Full Featured STOMP Broker Relay -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-reactor-netty</artifactId>
</dependency>

Далее надо включить RabbitMQ в классе конфигурации WebSocketConfig.java таким образом:

public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.setApplicationDestinationPrefixes("/app");

    // Use this for enabling a Full featured broker like RabbitMQ
    registry.enableStompBrokerRelay("/topic")
            .setRelayHost("localhost")
            .setRelayPort(61613)
            .setClientLogin("guest")
            .setClientPasscode("guest");
}

Как я выкладывал Flask веб-приложение с socketio

Я написал программу на Flask, которая сочетала в себе 2 веб-приложения: веб-сервер и SocketIO сервер. Лучше было бы писать их, подключать к брокеру сообщений и деплоить раздельно. Главная идея классическая и заключалась в том, что один пользователь через веб-интерфейс генерировал event, а другие пользователи получали сообщение через SocketIO. Проблема с которой я стокнулся лежала в области деплоя, то есть возникла на завершающей стадии. Я захотел использовать uWSGI сервер для деплоя своего Flask приложения. uWSGI — отличный сервер приложений, который по сути заменяет собой две сущности supervisor и gunicorn.

Итоги

Задача этой статьи не в том, чтобы сделать некий итоговый вывод о том, предлагает ли экосистема Node.js самые лучшие средства для серверной разработки. Здесь не идёт речь и о том, чтобы склонить кого-либо к использованию Node. Я, к тому же, не собираюсь говорить, что Node значительно превосходит другие популярные серверные среды, разработка в которых ведётся с использованием Java, C#, C++, PHP, Python, Go или Ruby.

Полагаю, самое главное, что мне хотелось сделать — так это показать, что между безапеляционными «да» и «нет», которые можно встретить во многих рассуждениях о Node и о JS как о серверном языке, если обширная область «может быть».

И, нравится это кому-нибудь или нет, интерес к Node постоянно растёт.

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

В задачи каждого разработчика входит тщательный подбор технологий, подходящих для реализации любого нового проекта

При этом важно учитывать все возможности и не отбрасывать сходу имеющиеся альтернативы

Например, в компании Snipcart, где я работаю, используется архитектура .NET, о которой можно наговорить много всего нелицеприятного. Почему выбрана именно она? Да просто потому, что в конкретный момент она оказалась наилучшим инструментом для решения поставленной перед нами задачи.

Надеюсь, мой рассказ о Node поможет вам принять правильное решение при выборе серверной платформы для вашего очередного проекта.

Итого

WebSocket – современное средство коммуникации. Кросс-доменное, универсальное, безопасное.

На текущий момент он работает в браузерах IE10+, FF11+, Chrome 16+, Safari 6+, Opera 12.5+. В более старых версиях FF, Chrome, Safari, Opera есть поддержка черновых редакций протокола.

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

Есть и готовые библиотеки, реализующие функциональность COMET с использованием сразу нескольких транспортов, из которых вебсокет имеет приоритет. Как правило, библиотеки состоят из двух частей: клиентской и серверной.

Например, для Node.JS одной из самых известных библиотек является Socket.IO.

К недостаткам библиотек следует отнести то, что некоторые продвинутые возможности WebSocket, такие как двухсторонний обмен бинарными данными, в них недоступны. С другой – в большинстве случаев стандартного текстового обмена вполне достаточно.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Люкс-хост
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: