WebSockets — полноценный асинхронный веб

    Пару недель назад разработчики Google Chromium опубликовали новость о поддержке технологии WebSocket. В айтишном буржунете новость произвела эффект разорвавшейся бомбы. В тот же день различные очень известные айтишники опробовали новинку и оставили восторженные отзывы в своих блогах. Моментально разработчики самых разных серверов/библиотек/фреймворков (в их числе Apache, EventMachine, Twisted, MochiWeb и т.д.) объявили о том, что поддержка ВебСокетов будет реализована в их продуктах в ближайшее время.
    Что же такого интересного сулит нам технология? На мой взгляд, WebSocket — это самое кардинальное расширение протокола HTTP с его появления. Это не финтифлюшки, это сдвиг  парадигмы HTTP. Изначально синхронный протокол, построенный по модели «запрос — ответ», становится полностью асинхронным и симметричным. Теперь уже нет клиента и сервера с фиксированными ролями, а есть два равноправных участника обмена данными. Каждый работает сам по себе, и когда надо отправляет данные другому. Отправил — и пошел дальше, ничего ждать не надо. Вторая сторона ответит, когда захочет — может не сразу, а может и вообще не ответит. Протокол дает полную свободу в обмене данными, вам решать как это использовать.

    Я считаю, что веб сокеты придутся ко двору, если вы разрабатываете:
    — веб-приложения с интенсивным обменом данными, требовательные к скорости обмена и каналу;
    — приложения, следующие стандартам;
    — «долгоиграющие» веб-приложения;
    — комплексные приложения со множеством различных асинхронных блоков на странице;
    — кросс-доменные приложения.



    И как это работает?



    Очень просто! Как только ваша страница решила, что она хочет открыть веб сокет на сервер, она создает специальный javascript-объект:
    1. <script>
    2. ws = new WebSocket("ws://site.com/demo");
    3.  
    4. // и навешивает на новый объект три колл-бека:
    5.  
    6. // первый вызовется, когда соединение будет установлено:
    7. ws.onopen = function() { alert("Connection opened...") };
    8.  
    9. // второй - когда соединено закроется
    10. ws.onclose = function() { alert("Connection closed...") };
    11.  
    12. // и, наконец, третий - каждый раз, когда браузер получает какие-то данные через веб-сокет
    13. ws.onmessage = function(evt) { $("#msg").append("<p>"+evt.data+"</p>"); };
    14.  
    15. </script>
    * This source code was highlighted with Source Code Highlighter.


    А что при этом происходит в сети?

    Все начинается так же как в обычном HTTP-запросе. Браузер подключается по протоколу TCP на 80 порт сервера и дает немного необычный GET-запрос:
    GET /demo HTTP/1.1
    Upgrade: WebSocket
    Connection: Upgrade
    Host: site.com
    Origin: http://site.com


    Если сервер поддерживает ВебСокеты, то он отвечает таким образом:
    HTTP/1.1 101 Web Socket Protocol Handshake
    Upgrade: WebSocket
    Connection: Upgrade
    WebSocket-Origin: http://site.com
    WebSocket-Location: ws://site.com/demo



    Если браузер это устраивает, то он просто оставляет TCP-соединение открытым. Все — «рукопожатие» совершено, канал обмена данными готов.
    Как только одна сторона хочет передать другой какую-то информацию, она отправляет дата-фрейм следующего вида:
    0x00, <строка в кодировке UTF-8>, 0xFF

    То есть просто строка текста — последовательность байт, к которой спереди приставлен нулевой байт 0x00, а в конце — 0xFF. И все — никаких заголовков, метаданных! Что именно отправлять, разработчики полностью оставили на ваше усмотрение: хотите XML, хотите JSON, да хоть стихи Пушкина.
    Каждый раз, когда браузер будет получать такое сообщение, он будет «дергать» ваш колл-бек onmessage.

    Легко понять, что КПД такого протокола стремится к 95%. Это не классический AJAX-запрос, где на каждую фитюльку приходится пересылать несколько килобайт заголовков. Разница будет особенно заметна если делать частый обмен небольшими блоками данных. Скорость обработки так же стремится к скорости чистого TCP-сокета — ведь все уже готово — соединение открыто — всего лишь байты переслать.
    Лирическое отступление:
    И еще одна вещь, которая меня очень радует - в качестве единственной разрешенной кодировки выбрана UTF-8! Я уже робко надеюсь, что через некоторое время мы уйдем от одного из костылей веба.



    А картинку можно отправить?

    С помощью WebSockets так же можно передавать и бинарные данные. Для них используется другой дата-фрейм следующего вида:
    0x80, <длина - один или несколько байт>, <тело сообщения>

    Что значит «один или несколько байт»? Чтобы не создавать ограничений на длину передаваемого сообщения и в тоже время не расходовать байты нерационально, разработчики использовали очень хитрый способ указания длины тела сообщения. Каждый байт в указании длины рассматривается по частям: самый старший бит указывает является ли этот байт последним (0) либо же за ним есть другие (1), а младшие 7 битов содержат собственно данные. Обрабатывать можно так: как только вы получили признак бинарного дата-фрейма 0x80, вы берете следующий байт и откладываете его в отдельную «копилку», смотрите на следующий байт — если у него установлен старший бит, то переносите и его в «копилку», и так далее, пока вам не встретится байт с 0 старшим битом. Значит это последний байт в указателе длины — его тоже переносите в «копилку». Теперь из всех байтов в «копилке» убираете старшие биты и слепляете остаток. Вот это и будет длина тела сообщения. Еще можно интерпретировать как 7-битные числа без старшего бита.

    Например, самую главную картинку веб-дизайна — прозначный однопиксельный GIF размером 43 байта можно передать так:
    0x80, 0x2B, <тело сообщения>

    Объект размером 160 байт закодируется 2 байтами длины:
    0x80, 0x81, 0x20, <байты объекта>

    Не правда ли, очень элегантно?

    Что это нам дает?


    Скорость и эффективность

    Высокую скорость и эффективность передачи обеспечивает малый размер передаваемых данных, который иногда даже будет помещаться в один TCP-пакет — здесь, конечно, же все зависит от вашей бизнес-логики. (В дата-фрейм можно засунуть и БСЭ, но для такой передачи потребуется чуть больше 1 TCP- пакета. :) ).
    Так же учтите, что соединение уже готово — не надо тратить время и трафик на его установление, хендшейки, переговоры.

    Стандартность

    Самим своим выходом WebSockets отправит на свалку истории Comet и все приблуды накрученные поверх него — Bayuex, LongPolling, MultiPart и так далее. Это все полезные технологии, но по большей части, они работают на хаках, а не стандартах. Отсюда периодески возникают проблемы: то прокся ответ «зажевала» и отдала его только накопив несколько ответов. Для «пробивания» проксей часто использовался двух-килобайтный «вантуз» — т.е. объем передаваемых данных увеличивался пробелами (или другими незначащими символами) до 2К, которые многие прокси передавали сразу, не задерживая. Периодически антивирусы выражали свое желание получить ответ полностью, проверить его, и только потом передать получателю. Конечно, сегодня все эти проблемы более-менее решены — иначе бы не было такого большого кол-ва веб-приложений. Однако, развитие в этом направлении сопряжено с появлением новых проблем — именно потому, что это попытка делать в обход стандарта.

    На мой взгляд, через некоторое время останется только 2 технологии: чистый AJAX и WebSockets. Первая хороша для одно- или несколькоразовых обновлений на странице — действительно, врядли рационально для этого раскочегаривать мощную машину веб-сокетов. А все остальное, что сейчас делается кометом и коллегами, переедет на веб-сокеты, т.к. это будет проще и эффективнее. Например, вы хотите вживую мониторить цены на рынке форекс. Пожалуйста: открывайте сокет — сервер вам будет присылать все обновления. Ваша задача только повесить правильный колл-бек на событие onmessage и менять циферки на экране. Вы решили что-то прикупить, отправьте серверу асинхронное сообщение, а параллельно продолжайте получать циферки. Элегантно? По сравнению с этим LongPolling с необходимостью периодческого рестарта даже неактивного канала (чтобы его прокся или еще кто не прихлопнул) выглядит грязным хаком.

    Время жизни канала

    В отличие от HTTP веб-сокеты не имеют ограничений на время жизни в неактивном состоянии. Это значит, что больше не надо периодически рефрешить соединение, т.к. его не вправе «прихлопывать» всякие прокси. Значит, соединение может висеть в неактивном виде и не требовать ресурсов. Конечно, можно возразить, что на сервере будут забиваться TCP-сокеты. Для этого достаточно использовать хороший мультиплексор, и нормальный сервер легко потянет до миллиона открытых коннектов.

    Комплексные веб-приложения

    Как известно в HTTP предусмотрено ограничение на число одновременных октрытых сессий к одному серверу. Из-за этого если у вас много различных асинхронных блоков на странице, то вам приходилось делать не только серверный, но и клиентский мультиплексор — именно отсюда идет Bayeux Protocol.
    К счастью, это ограничение не распространяется на веб-сокеты. Открываете столько, сколько вам нужно. А сколько использовать — одно (и через него все мультиплексировать) или же наоборот — на каждый блок свое соединение — решать вам. Исходите из удобства разработки, нагрузки на сервер и клиент.

    Кросс-доменные приложения

    И еще один «камень в ботинке» AJAX-разработчика — проблемы с кросс-доменными приложениями. Да, и для них тоже придумана масса хаков. Помашем им ручкой и смахнем скупую слезу. WebSockets не имеет таких ограничений. Ограничения вводятся не по принципу «из-того-же-источника», а из «разрешенного-источника», и определяются не на клиенте, а на сервере. Думаю, внимательные уже заметили новый заголовок Origin. Через него передается информация откуда хотят подключиться к вашему websocket-у. Если этот адрес вас не устраивает, то вы отказываете в соединение.
    Все! Конец кросс-доменной зопяной боли!

    А руками пощупать можно?

    Можно!

    UPDATE: Одной из открытых реализаций веб-сокетов является чат на www.mibbit.com (заметка в их блоге).
    PHP-реализация сервера WebSocket также представлена модулем к асинхронному фреймворку phpDaemon, модуль называется WebSocketServer. Пример простейшего приложения, которое отвечает «pong» на фрейм (пакет) «ping» — ExampleWebSocket.
    Вы можете попутно прослушать соедиение с помощью например tcpdump или любой другой программы и увидеть в действии всю ту механику, которую я описал выше.

    Светлое будущее


    И когда же оно настанет? На самом деле очень скоро. Гугл в очередной раз дал «волшебного пендаля» всей веб-индустрии, и все зашевелились. Вы удивитесь, но тут же люди вспомнили, что в багзилле фаерфокса уже год(!) висит задача на эту тему. В Хроме все изменения сделаны в WebKit — а значит очень скоро появится поддержка в Safari. Скоро подтянутся и остальные браузеры.

    А если нельзя, но очень хочется?

    На этот случай придуман временный заменитель — библиотечка web-socket-js с помощью флеша эмулирующая веб-сокеты. К сожалению, у нее есть небольшие проблемы с проксями и кросс-доменной работой. Но в качестве временного решения ее стоит опробовать.

    Выводы


    На мой взгляд, как только люди распробуют, эта технология получить очень широкое распространение. К весне-лету мы получим массу сайтов с ней. И как в свое время несколько лет прошло «под звездой AJAX», так и здесь год-другой мы будем слышать отзывы о внедрении WebSockets повсеместно.

    ...


    Осторожно, двери закрываются. Не опоздайте на поезд в будущее...

    Оригинал: Введение в WebSockets — полноценный асинхронный веб
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 388
    • +10
      Правильный веб 2.0?
      Только на днях начал ковырять comet-технологию, а тут такое.
      Будем-с ждать :)
      • +1
        Я тоже в серьез присматривался к Comet и Beyeux для одного проекта, но нашел WebSockets. На мой взгляд, эта технология на голову или даже 2 выше! Но еще очень свежая.
        • +1
          Пока она еще появится повсеместно…
          • 0
            Кстати, говоря, это зависит от нам.
            Насколько активно мы итешники будем разрабатывать и пиарить свои сервисы. Чем больше интересных вещей будет, тем быстрее пользователь начнет этим пользоваться.
          • 0
            Очень-очень свежая.
            Например, не совсем ясно, если у комета проблемы с принудительным закрытием злыми проксями долго висящих соединений, то почему таких же проблем не будет у websockets?
            • 0
              Здесь ответит только эксперимент. Но веб-сокеты разрабатывались с учетом этих проблем, поэтому они используют для проксей бинарный транспорт. Вот тут веточка обсуждения.
          • +8
            Я начал ковырять Google Gears, а через неделю узнал что Google будет от нее отказываться в пользу HTML5.
          • +3
            Вау! Занятно
            • +7
              Занятно, но опять вся радость закончится на IE :-(
              • +8
                Это именно тот случай, когда можно заставлять ставить браузер. Это платформа веб приложений.
                • 0
                  Не закончится.

                  Я думаю, что MS поддержит идею, пусть даже не сразу, но ждать долго не заставит.
                  • +1
                    Да и IE8 не такой уж и плохой браузер. Хоть я им и не пользуюсь из за пары плагинов в FF. Но я то не %USERNAME% — мне они как воздух.
                    Если бы не они — пользовался бы IE8.

                    "… да, знаю, грусть, злоба и осадок на душе остаётся после нескольких лет разработки под IE6.
                    Но я уже отпустил IE6 и простил его. Пусть отходит с миром. Всё будет хорошо."
                    • 0
                      IE8 может и неплохой браузер (во сколько раз он отстает по скорости js от ФФ? а от хрома?), но если MS не захочет — поддержки сокетов в IE не будет. А зачем бы им делать эту поддержку, сдавая лишние козыри гуглу?
                      • +3
                        В «интернетах» гугл практически вездесущ, по этому может просто взять, да и придавить его некоторыми ресурсами, без которых уже юзер не сможет. На пример гугло-почтой.

                        Как-то раз на какой-то конференции (не помню, но точно слышал) у дядьки с гугля спросили «а когда же это всё зарботает в IE?» на что он ответил «IE? я не знаю такого браузера» (или как-то так) — вот такая политика.

                        И БАМ! в IE8 всё работает.

                        если допустим пользователи gmail не смогут заходить на свою почту (а её часто в последнее время оказывается именно gmail) то от IE они откажутся.

                        Со времён IE6 политика MS значительно изменилась. Я бы даже сказал, что они существенно поумнели.
                        • 0
                          А им деваться будет некуда. Как-то Билл Гейтс говорил что интернетом они заниматься не будут, а будут продвигать сеть АОЛ, но потом пришлось забить на АОЛ, заняться интернетом и сделать свой браузер.
                      • +1
                        Охохо…
                        Вот этого я жду с содроганием. МС опять окажется в роли догоняющего, а значит реализует в спешке и криво — значит будет брешь в системе. Через нее пойдет большой поток вирусов. Что негативно скажется на мнении о самой технологии, хотя тут она совершенно не виновата. Начнут повсеместно отключать, резать на корпоративных проксях и так далее. Быть может помните, на заре веба была проблема с куков?
                        В итоге все проиграют: и пользователи, затормозится развитие технологий, и рейтинг самого МС опустится еще ниже плинтуса.
                        • 0
                          Не пророчьте апокалипсис! %USERNAME% и так в страхе живёт ;)

                          Я думаю таки что-то изменилось, и так тупить в МС уже не станут. Тем более, что не так уж будет и сложно сделать поддержку WebSocket без багов, как по мне.

                          Всё будет хорошо ;)
                          • 0
                            форсируется поддержка нормальных браузеров имхо, и все. Прокси тоже обычно ставят не дураки, а такие же люди как мы с вами, которые знают про альтернативные браузеры. Хотя конечно хз как оно еще повернется
                            • 0
                              даже если МС и не затупит с реализацие в новых версиях, все равно останется проблема со старыми версиями ИЕ. А пользователи экплорера наиболее инертны в плане обновлений. Так что широкодоступной эта технология станет ой как не скоро.
                              • 0
                                Да, есть такая проблема.
                                Я думаю, что появление новых сайтов, где удачно будет использована эта технология поможет обновлению браузеров.
                      • 0
                        Что именно отправлять, разработчики полностью оставили на ваше усмотрение: хотите XML, хотите AJAX, да хоть стихи Пушкина.

                        Под AJAX вы имели ввиду JSON? :)
                        • 0
                          Да, конечно, JSON! Спасибо, сейчас поправим.
                        • 0
                          В первом скрипте в строке 10 опечатка: не «onopen» там должно стоять.
                          • +1
                            Спасибо. Не заметил.
                          • 0
                            >Теперь уже нет клиента и сервера

                            >Если браузер это устраивает, то он просто оставляет _TCP-соединение_ открытым

                            >Теперь уже нет клиента и сервера

                            ммм? что?
                            • +1
                              Я имел ввиду, что различие между браузером и сервером теперь в одном — что браузер инициирует соединение, а дальше они уже работают на равных: нет четко выраженного разделения на «спрашивающий» и «отвечающий».
                              • +3
                                >нет четко выраженного разделения на «спрашивающий» и «отвечающий»
                                простите, но ОТВЕЧАЮЩИЙ — любом случае сервер. или сервер может САМОСТОЯТЕЛЬНО инициировать подключение к клиенту?
                                • +3
                                  Нет, сервер не может. Инициатива всегда исходит от клиента.
                                  Я немного запутал вас в терминологии.
                                  Но возможен такой сценарий: клиент установил подключение до сервера и молчит. Когда серверу потребовались данные — например ФИО пользователя — он сам направляет клиенту асинхронное сообщение. Клиент показывает какую-то форму пользователю, принимает данные и отсылает их на сервер.
                                  В таком варианте вроде бы как сервер спрашивающая сторона. :)

                                  Вот еще важный момент! Поскольку соединение асинхронное то правильнее о нем думать не как о сессии «вопрос-ответ», а как «репликах в воздух».
                                  • 0
                                    смысл фразы в том, что _сейчас_ бравзер является исключительно клиентом — и «в большом» (первоначальное подключение) и «в малом» (небольшие транзакции в рамках одного подключения, например AJAX-запросы).
                                    Веб-сокеты позволят реализовать равноправность «в малом», сохранив разделение «в большом».
                                    • +2
                                      * AJAX-запросы в том смысле, что чтобы это работало клиент (бравзер) должен сам регулярно опрашивать сервер «а не появилось ли у тебя чего-нибудь новенького». Сервер же вообще никак не может обратиться к клиенту кроме как по запросу от него.
                                      • 0
                                        Вы очень хорошо и понятно описали :)
                                        • 0
                                          Подскажите, текущая реализация Ajax держит TCP подключение или создает его каждый раз, когда javascript отправляет запрос на сервер (обычный или long poll)? Что-то меня вот этот комментарий смутил: habrahabr.ru/blogs/webdev/79038/#comment_2318372
                                          • +1
                                            м, вроди бы AJAX это принцип, а не конкретная реализация =)

                                            К несчастью, я не очень хорошо разбираюсь в особенностях существующих механизма запросов (про аякс, асинхронность и прочее я выводы получил совсем через другие размышления).
                                            Погуглив, нашел статейку на ангельском — вроди в ней есть указания на нужные сведения (и, заодно, о технологии, которой товарисч козырял).
                                            • 0
                                              Не AJAX, а XHR. Пока клиент не закрыл соединение оно идет в рамках одного TCP соединения.
                                  • +1
                                    > хаках, а не стандартых
                                    очепяточку поправьте плз. И большое спасибо за интересный материал.

                                    ЗЫ Интересно, если бы такая смелая затея вышла не из гугла, а из чего-то масштабом помельче — прошло бы?
                                    • +2
                                      Тут дело не в гугле — самой идее больше года — www.w3.org/TR/websockets/ Гугл — лишь первый, кто ее реализовал.
                                      Опять повторился сценарий «волшлебного пендаля», как было с Хромом. Вышел браузер с быстрым яваскриптом и инкогнито-режимом — вроде бы ничего нового — но все тут же подтянулись.
                                      • 0
                                        Кто-нибудь может мне объяснить, зачем нужен инкогнито-режим? Порнуху смотреть, чтобы подруга по хистори не запалила?
                                        • +2
                                          да хотя бы, почему нет
                                          • 0
                                            Ходить на левые сайты, если вы залогинены где-то где есть (может быть) XSS
                                            • +2
                                              На чужом компе чтобы своих куков не оставлять
                                              • +1
                                                Логично.
                                                Про чужой комп я не думал…
                                        • 0
                                          Сча я напишу модуль для phpDaemon. Будет опупенно.
                                          • 0
                                            Ждем! :)
                                            • 0
                                              Кинул в закладки ваше заявление ;)

                                              Всё будет хорошо. Я гарантирую это.
                                              • +1
                                                Набросок тут — тут. Протокол реализован. Осталось сделать API внутри самого демона.
                                                • +3
                                                  API тоже готово. Пример приложения вот тут — ExampleWebSocket.php. Оно отвечает 'pong' на фрейм 'ping'. Вот тут — тестовая страничка.
                                                  • 0
                                                    Круто. Вечером покатаюсь.
                                                    Жаль плюсавать не могу :(
                                              • +3
                                                Теперь еще Google Protobuf под Javascript портировать и будет совсем сказка в плане снижения объема передаваемых данных

                                                Но впрочем я это за одну только асинхронность готов любить. Web от client-server становится площадкой общения равноправных игроков — это замечательно
                                                • 0
                                                  Можно. Но с другой стороны надо ли?
                                                  WebSockets по скорости и эффективности передачи данных практически равен чистому TCp-соединению. Здесь не надо слишком сильно оптимизировать, потому мы имеем дело с открытой системой — то есть чтобы все кто угодно могли с ней легко взаимодействовать. Здесь лучше оставить некоторую абстрактность и гибкость.
                                                  Protobuf — это чисто гугловая вещь, а WebSockets — общественный стандарт планируемый для широкого использования.
                                                  • +2
                                                    WebSockets это транспорт, Protobuf это эффективная инкапсуляция — не путайте. Стандарт никак не описывает в каком именно виде вы данные будете гонять.
                                                    • 0
                                                      В принципе да — у нас есть универсальный бинарный контейнер.
                                                      Надо только, чтобы приложение понимало, что оно получает.
                                                    • 0
                                                      >> WebSockets по скорости и эффективности передачи данных практически равен чистому TCp-соединению.

                                                      WebSockets это фактически TCP over HTTP, так что оверхед есть и немалый.
                                                      • 0
                                                        > WebSockets это фактически TCP over HTTP, так что оверхед есть и немалый.
                                                        Не соглашусь с вами. HTTP используется только на начальной стадии, дальше идет почти чистый TCP. Единственное отличие — к передаваемым строкам добавляется по 1 байту в начало и конец.
                                                    • 0
                                                      Кстати да, возможно есть смысл попробовать их объединить.
                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                                      • +3
                                                        только гуглу слава не за вебсокеты, а за гениальное ведение бизнеса. вместо того чтоб ввязываться в битву за десктопные ОС, гугл в нее особо не лезет, зато постепенно переманивает противников на своё поле.
                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                          • 0
                                                            Не переманивает, а мы занимаем это поле. Это было неизбежно
                                                            • +4
                                                              не мы занимаем поле — нами его занимают.
                                                        • 0
                                                          XHTTPRequest больше ненужен? Уря товарищи!
                                                          • +3
                                                            Да ну. Сокеты полезны, если нужно постоянный коннект держать. А если у нас добавление/изменение записей в БД или та же проверка доступности логина при регистрации, то зачем постоянное соединение держать?
                                                            Всему своё место. Сокеты будут нужны для динамически изменяющейся информации, например, чаты, новостные ленты и т.п.
                                                            • +2
                                                              Хотя, я кажется, глупость написал. Ничто не мешает открыть сокет, отправить/получить информацию и закрыть. Как с тем же XHTTPRequest. Вроде бы сокеты лишены некоторых минусов этого объекта.
                                                              В общем надо бы поподробнее почитать.
                                                          • +5
                                                            ну в общем-то логичный поворот. всё идёт к тому что в браузере по сути будет выполняться полноценное приложение, использующее HTML для прорисовки интерфейса и javascript внутри. Эдакий контейнер вроде старой доброй JVM, только с юзерфрендли-фронтендом ввиде табов.

                                                            Подход впринципе правильный т.к. если JAVA и ActiveX шли с десктопа в веб со всеми своими дырками в основном из доступа к локальной фс, javascript идёт наоборот из веба на десктоп и дырки в нём специально делать никто не станет.
                                                            • +1
                                                              Да. WebSockets входят в WebApplication.
                                                              • –2
                                                                Я думаю для интерфейсов даже HTML отомрет, будут прямо на канвасе интерфейс рисовать со всеми кнопочками и ляляками.
                                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                                  • –6
                                                                    просто данное решение позволяет вам выбрать самому6 использовать HTML или просто загрузить исполняемый код на машину клиенту.

                                                                    гммм, я уже вижу какие вирусы будут этим летом расти )))

                                                                    короче чем интереснее технология тем важнее в ней верификация сторон учавствующих в обмене.
                                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                                                      • –3
                                                                        WebSockets
                                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                                  • 0
                                                                    А какой смысл? Думаю то, что предусмотренно в HTML через него сделать проще (и браузером будет обрабатываться быстрее). Кнопки же в HTML как правило не делают картинками с обработчиком (если нет каких-то сильно необычных требований)
                                                                    • +1
                                                                      Вообще, во многих web application, да и на многих обычных сайтах кнопки делают в виде ссылок с картинкой (это не повод к холивару о том, правильно ли это, но тем не менее это факт).

                                                                      А DOM в браузерах ооочень медленный. Особенно в FF и IE.
                                                                      • +1
                                                                        Ставят. Но, на мой взгляд, это скорее недоработка HTML — невозможность через него сделать картинку кнопкой. Как и многое другое.
                                                                        DOM, конечно, медленный. Но не думаю, что canvas, управляемый js, будет работать быстрее. С чего бы? DOM все-таки львиную часть работы по отрисовке отдает скомпилированному коду. Canvas — нет.
                                                                        • +1
                                                                          DOM помимо отрисовки выполняет ещё множество вещей, связанных с определением правильного положения элементов, их размеров и т.п. Кроме того, я не знаю никакой возможности хоть как-то буферизовать изменения свойств узлов дерева. Например, я меняю свойства для 10 элементов в DOM'е… и на каждое изменение каждого из свойств, браузер(по-крайней мере IE точно) будет пытаться перестраивать и перерисовывать дерево.

                                                                          Мне кажется, что канвас на специфических задачах навороченного и очень динамического GUI вполне может оказаться быстрее. Тем более, что скрипты сейчас чуть ли не в нативный код компилируются.
                                                                          • +1
                                                                            В специфических — безусловно. Но думаю, что все-таки с простой ссылкой работа будет быстрее, чем с нарисованным в canvas текстом и обработчиком на нем.
                                                                            Вопрос в том, сколь сложные задачи лучше решать с помощью canvas. Реализовывать сложную работу с графикой через всевозможные хитрые манипуляции — глупо. Но и простое отображение текста через canvas — тоже. Где-то в промежутке есть задача, которую одинаково сложно делать как на HTML, так и с cavnas.
                                                                            • –1
                                                                              Ну вот… hollywar detected :)
                                                                            • +1
                                                                              Ставьте родительскому элементу св-во display: none на время модификации, будет вам буферизация. Довольно известный трюк.
                                                                              • 0
                                                                                Да, трюк известный, но, судя по результатам профилирования в IE, использование его не оказало существенного влияния на количество и скорость производимых IE операций по рендерингу. Возможно где-то была ошибка, но т.к. производительность нашего приложения в IE6 и без этого на достаточно высоком уровне, глубоко я не копал. Может быть на предстоящих выходных поэкспериментурую с этим.
                                                                                • +2
                                                                                  Вот несколько неплохих советов по оптимизации от Оперы, хотя насколько они помогут в случае с IE ручаться не могу.
                                                                                  dev.opera.com/articles/view/efficient-javascript/?page=3
                                                                                  • 0
                                                                                    Спасибо за ссылку :-) Хотя, слава богу, оптимизировать приложение под Оперу пока не приходилось (куда ещё быстрее?).
                                                                            • 0
                                                                              > невозможность через него сделать картинку кнопкой.
                                                                              Не очень понял вас, а как же <input type=«button» ...>?
                                                                              • +2


                                                                                />

                                                                                Покажите мне браузер, который это не поддерживает.
                                                                                • +2
                                                                                  <style type="text/css">
                                                                                  .btn { background: url(img.png) no-repeat; width:16px;height:16px; display:inline-block; }
                                                                                  .btn:hover { background: url(imgHover.png); }
                                                                                  input.btn { outline: none; border: none; }
                                                                                  </style>
                                                                                  
                                                                                  <input type="button" class="btn" />
                                                                                  

                                                                                  Спать пора… :)
                                                                                  • –2
                                                                                    а так же или

                                                                                    Вы чертовски правы! Пора спать!
                                                                                    • 0
                                                                                      а так же input type=«image» или просто тег button
                                                                          • +3
                                                                            врядли отомрёт скорее расширится. многие и под десктопные оси предпочитают интерфейс на HTML рисовать ибо просто, быстро и легко найти верстальщика
                                                                            • +1
                                                                              Вот только потому, что верстальщика просто найти…
                                                                              Для верстки текста — согласен HTML рулит.
                                                                              А для интерфейса типа MS Office, HTML получится сложный и тяжелый
                                                                              Мне кажется у канваса, в перспективе скорость и легкость (нет dom, стилей и пр....).
                                                                              Договориться, как отображать HTML гораздо сложнее чем как рисовать на канвасе.
                                                                              Описание стандарта будет тупо больше, поэтому и сложее. А значит место для разночтений и ошибок.
                                                                              Сравните стандарт по HTML+CSS и по канвасу.
                                                                              А строить интерфейсы все равно будут через либы типа ExtJS
                                                                              • 0
                                                                                тут согласен. всему своё. но HTML не обязательно для вёрстки текстов — для любого несложного приложения на ура сгодится.
                                                                            • 0
                                                                              Как пример bespin.mozilla.com/ Полностью на canvas рисуется.
                                                                              • +1
                                                                                о_О Зашёл, открыл firebug, поинспектил элементы — html как он есть.
                                                                                Может быть я куда-то не туда посмотрел, но «полностью на canvas рисуется» не увидел.
                                                                                • 0
                                                                                  Ну насколько я понимаю речь идёт не о сайте https://bespin.mozilla.com/, а об их продукте Bespin, для просмотра которого нужна регистрация (она ещё и с оперой не дружит, при этом не даёт продолжить на свой страх и риск).
                                                                                  • +1
                                                                                    Если я ничего не перепутал, этот их продукт — онлайновый html-редактор.
                                                                                    Зарегистрировался, посмотрел под фаерфоксом — опять же, никакого намёка даже на «только canvas» не обнаружил.
                                                                                    • 0
                                                                                      Это весьма странно. Я тоже зарегистрировался и тоже смотрю под фаерфоксом, и, насколько я вижу, сам редактор — это всё-таки canvas. Прочие вспомогательные элементы интерфейса, вроде кнопок сохранения, всё-таки html.
                                                                                      • 0
                                                                                        Вот и я о том — это явно не «только canvas».
                                                                                        Те же самые кнопочки рисовать может и нарисуешь, а обработчики на них повесить как в рамках canvas'а?
                                                                                        Всему своё место. Старый добрый HTML рано списывать со счетов, он много на что годится.
                                                                                        • 0
                                                                                          а обработчики на них повесить как в рамках canvas'а?

                                                                                          Легко)
                                                                          • 0
                                                                            Выглядит красиво :) Ждем полноценной поддержки всеми браузерами и серверами :)
                                                                            • +2
                                                                              Я что-то не понял, оно держит открытым соединение? Если это так, то полный ахтунг, это же какие нагрузки!
                                                                              • 0
                                                                                А какие нагрузки от неактивного соединения?
                                                                                Как раз постоянное подключение-отключение создаст большую нагрзку.
                                                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                                                  • +1
                                                                                    Максимально возможное количество соединений ограничивается ядром, в данном случае оно должно будет быть увеличено, что строго говоря не есть гуд.
                                                                                    • 0
                                                                                      А с longpoll/comet сейчас не так? И в чем не гуд? Если надо, то надо чтобы было гуд, патчи там и тп, если сейчас что-то мешает: )
                                                                                      • +1
                                                                                        Оно настраивается.
                                                                                        Вот пример сервера, который поддерживает 1 миллион коннектов, да не просто поддерживает, а работает с ними: www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-1
                                                                                    • +1
                                                                                      Не больше чем от открытой ICQ.
                                                                                    • 0
                                                                                      Как же давно я этого ждал!
                                                                                      Теперь смогу графики и логи в браузере смотреть в реальном времени.
                                                                                      • 0
                                                                                        Вышеприведённый скрипт демонстрирует, как клиент слушает сервер.

                                                                                        А вот ws.send('. . .') не показан, например.
                                                                                        • +3
                                                                                          Это первая вводная статья. Если будет интерес — то продолжу дальнейшие изыскания.
                                                                                          Я подумал, что она и так уже длинная — чтобы не мучать читателя часть технологии опустил.
                                                                                          • 0
                                                                                            Понятно.
                                                                                            • +2
                                                                                              продолжите изыскания, пожалуйста! ;)
                                                                                              • +2
                                                                                                Ну Вы поняли насчет интереса :) Он есть!
                                                                                            • +5
                                                                                              Надо попросить Сысоева добавить поддержку проксирования таких приложений. Не выделять же под это отдельный IP-шник…
                                                                                              • +2
                                                                                                Сам уже об этом подумал :)
                                                                                                Я думаю Игорь добавит в nginx хороший мультиплексор и это позволит еще снизить нагрузку на сервер по поддержанию множества сокетов.
                                                                                              • 0
                                                                                                Половина дороги пройдена, ура.

                                                                                                А когда и на другом конце вместо сервера сможет быть браузер, то тогда такой P2P начнётся!..
                                                                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                  • 0
                                                                                                    Да. Пока без сокетов, впрочем.
                                                                                                    • –2
                                                                                                      Это тоже не сокеты.
                                                                                                  • 0
                                                                                                    Браузеры, как правило, за проксями и натами всякими.
                                                                                                    • +1
                                                                                                      Ну, это препятствие P2P-сети преодолевают через промежуточные незафайерволленные узлы.
                                                                                                      • 0
                                                                                                        Ага, в случае браузеров это сервер.
                                                                                                      • 0
                                                                                                        NAT penetration эффективно пробивает 70-80% NAT'ов.
                                                                                                      • 0
                                                                                                        Откройте для себя adobe flash:)
                                                                                                        • 0
                                                                                                          флеш позволяет создать приложение-сервер (подключение клиента к другим клиентам)? можно пример, ссылку или место в документации?
                                                                                                        • 0
                                                                                                          Flash обременяет разработчика средством разработки, а пользователя необходимостью это flash установить. И всё это при том, что как средство разработки, так и плагин производятся одной фирмой и не имеют альтернатив.

                                                                                                          ps про gnash знаю
                                                                                                      • 0
                                                                                                        Будучи ламером и параноиком, спрошу: а не даст ли это серверам злоумышленников возможность как-либо серьезно портить жизнь пользователям?
                                                                                                        • +10
                                                                                                          ламер+параноик — ядрёная смесь
                                                                                                          • +1
                                                                                                            Не сильнее, чем сейчас.
                                                                                                            • +3
                                                                                                              Наверняка даст. Как только пойдут массовые реализации, начнутся и грабли, которые в спецификации не описаны :)
                                                                                                            • +4
                                                                                                              я не очень понял, что помешает криво настроенным проксям/антивирусам обрубать или тормозить соединения websocket, раз уж они так сильно похожи на обычные http-запросы?

                                                                                                              и касательно ограничения одновременных соединений — вы уверены, что оно прописано именно в стандарте HTTP? Почему тогда у каждого браузера своё ограничение?
                                                                                                              • +1
                                                                                                                > я не очень понял, что помешает криво настроенным проксям/антивирусам обрубать или тормозить
                                                                                                                > соединения websocket, раз уж они так сильно похожи на обычные http-запросы?
                                                                                                                В споре кривизны с прямизной, однозначно победит кривизна :)
                                                                                                                С проксями получается такая ситуация:
                                                                                                                — если прокся официальная (прописана в браузере), то она должна поддерживать метод CONNECT — с помощью которого браузер работает по HTTPS — ведь там тоже используется передача бинарных данных.
                                                                                                                — если это NAT — то он просто завернет подключение и никто этого не заметит.
                                                                                                                — самый сложный случай будет в случае «прозрачной прокси», когда все текущее на 80 порт заворачивается на сквид или другой прокси-сервер — здесь уже как он отработает. Впрочем я не исключаю, что в скором времени они научатся поддерживать веб сокеты.

                                                                                                                > и касательно ограничения одновременных соединений — вы уверены, что оно прописано именно в
                                                                                                                > стандарте HTTP? Почему тогда у каждого браузера своё ограничение?
                                                                                                                Могу путать, но где-то проскавала цифра 2 или 4.
                                                                                                                Конечно, это не жесткое ограничение — никто не мешает на своем фаерфоксе поставить цифру побольше. Однако есть некоторое официально рекомендованное значение, чтобы вы ненароком сервер не уронили.
                                                                                                                • 0
                                                                                                                  вы правы

                                                                                                                  Clients that use persistent connections SHOULD limit the number of
                                                                                                                  simultaneous connections that they maintain to a given server. A
                                                                                                                  single-user client SHOULD NOT maintain more than 2 connections with
                                                                                                                  any server or proxy.
                                                                                                              • 0
                                                                                                                Подскажите мне, неспециалисту, а чем это принципиально отличается от того, что сейчас реализовано во Flash? Насколько я понимаю (поправьте, если ошибаюсь), Flash уже давно может устанавливать асинхронные TCP соединение? YouTube, Augmented reality, игрушки всякие?
                                                                                                                • +4
                                                                                                                  тем, что это будет работать даже на тех устройствах, о которых не подозревают менеджеры Adobe
                                                                                                                  • +1
                                                                                                                    ну и на айфоне, теоретически
                                                                                                                    • 0
                                                                                                                      на айфон, теоретически собираются портировать флеш
                                                                                                                      • 0
                                                                                                                        насколько я знаю, его уже давно портировали, но apple не даёт его туда ставить
                                                                                                                  • +6
                                                                                                                    Тем что флеш — это хак, при чем очень грязный и в большинстве случаев его использования — абсолютно не нужный.
                                                                                                                    • +2
                                                                                                                      Рискну уйти глубоко в минус по рейтингу, но можете чуть поподробнее почему флэш является хаком? Я, к сожалению, больше по desktop решениям, но websockets даже для них открывает широчайшие перспективы :).
                                                                                                                      • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                                        • 0
                                                                                                                          Я думаю, автор имел в виду, что с помощью флеша часто обходят ограничения того же http и других доисторических прелестей, живущих у нас в браузере. Если так, то тут более подходит слово «костыль».
                                                                                                                      • +2
                                                                                                                        Да, мы делали транспортную часть между Javascript-приложением на flash. В итоге от неё отказались по двум причинам:
                                                                                                                        • — Из-за глюков flash раз в неделю падал весь браузер с SIGSEGV (или как оно в винде называется?), что сильно расстраивало пользователей.
                                                                                                                        • — У кого есть флэш, обычно включен флэшблок. То есть включить наш, естественно, невидимый, флэш он не сможет.

                                                                                                                        Разумеется, кроме флэша была и другая реализация двустороннего обмена данными.
                                                                                                                      • +1
                                                                                                                        > Пока я не нашел открытых веб-сокет сервисов
                                                                                                                        www.mibbit.com/

                                                                                                                        > качать на свой компьютер демо-пример вебсокетов на php
                                                                                                                        А еще есть Jetty, Cometd, Orbited, Lightstreamer
                                                                                                                        Полный список технологий и серверов есть тут: cometdaily.com/maturity.html
                                                                                                                        • –1
                                                                                                                          Это всё таки суррогаты, а не полноценные сокеты
                                                                                                                          • +2
                                                                                                                            Что такое «полноценные сокеты»? У всех перечисленных заявлена поддержка HTML5 WebSocket
                                                                                                                        • 0
                                                                                                                          > www.mibbit.com/
                                                                                                                          А где оно там используется? Сходу не заметил

                                                                                                                          > А еще есть…
                                                                                                                          Вы правы — сейчас появится много серверов с поддержкой WebSockets — некоторые команды уже реализовали ее.
                                                                                                                      • +2
                                                                                                                        А как будет происходить проверка на целостность пакетов?
                                                                                                                        • +4
                                                                                                                          это же tcp-соединение, нижний уровень обо всём позаботится
                                                                                                                          • 0
                                                                                                                            Написано же что используется TCP это вам не UDP…
                                                                                                                          • –2
                                                                                                                            WebSockets — гвоздь в гроб IE.
                                                                                                                            • +14
                                                                                                                              Боюсь, что все-таки IE — тормоз для WebSockets
                                                                                                                            • +6
                                                                                                                              Не уверен, что другие компании действительно быстро подтянутся. Хром заставил зашевелиться остальных из-за того, что при переходе на него пользователь сразу получал существенные преимущества.
                                                                                                                              Для использования же WebSockets веб-приложения должны писаться в рассчете на них. Пока эта технология не будет поддерживаться браузерами большинства пользователей — этого не будет. Пока не будет достаточно большого количества таких приложений — производителям других браузеров беспокоиться смысла нет.
                                                                                                                              Получится ситуация в чем-то аналогичная связанной с IE6: из-за его популярности его все (почти) поддерживают, а то, что в нем работает большинство сайтов поддерживает его популярность.
                                                                                                                              Если 95% сайтов перестанут поддерживать IE6 — его популярность мгновенно упадет почти до нуля. Если 95% сайтов будут требовать WebSockets — браузеры, его не поддерживающие, очень быстро потеряют пользователей.
                                                                                                                              Но конкретный сайт, не поддерживающий IE6 из-за этого потеряет посетителей. Конкретный сайт, требующий WebSockets — тоже.
                                                                                                                              Возможно, некоторым компромиссом будет реализация двух вариантов — с сокетами и без них (или использование того же web-socket-js).
                                                                                                                              Но:
                                                                                                                              1. Это сложнее, чем сделать что-то одно.
                                                                                                                              2. Такая ситуация мало чем угрожает браузерам, не поддерживающим сокеты.
                                                                                                                              Разве что в браузерах, поддерживающих сокеты, можно будет делать что-то существенно лучшее, чем без них.
                                                                                                                              Чем ситуация будет принципиально отличаться от, скажем, canvas? Он уже работает во всех основных браузерах, кроме IE. И часто его встретишь где-то кроме демонстрационных страничек?
                                                                                                                              • 0
                                                                                                                                Можно было букв поменьше
                                                                                                                                :-)

                                                                                                                                Исходя из общеизвестной страсти MS к Google, проигнорирует ли MS данную инициативу?

                                                                                                                                Если да, то прекрасное так и останется далеко…
                                                                                                                                • +4
                                                                                                                                  Скорее уж известная своим остроумием MS напишет свои MsSockets, с блекджеком и шлюхами :)
                                                                                                                                • 0
                                                                                                                                  Учитывая ещё, что в половине сайтов простой Javascript глючит :)
                                                                                                                                  • 0
                                                                                                                                    Для использования же WebSockets веб-приложения должны писаться в рассчете на них. Пока эта технология не будет поддерживаться браузерами большинства пользователей — этого не будет


                                                                                                                                    С Гугла станется наплевать на поддержку и начать внедрять вебсокеты с graceful fallback до обычных Ajax/Comet. Тут опять же пользователи браузеров с поддержкой WS окажутся в выигрыше.
                                                                                                                                  • +25
                                                                                                                                    Продвигают в массы технологии, нужные для Google Wave :D
                                                                                                                                    • 0
                                                                                                                                      скорее для их ос
                                                                                                                                    • +1
                                                                                                                                      Я что-то не нашел в этом ssl…
                                                                                                                                      • +3
                                                                                                                                        Я не стал раздувать статью, чтобы не мучать читателей.
                                                                                                                                        Но существует протокол WSS — это тот же самый WS только поверх SSL/TLS.
                                                                                                                                        Тоже самое как HTTP / HTTPS.
                                                                                                                                      • +10
                                                                                                                                        Теперь рекламу пользователю будут вдувать еще и через сокеты.
                                                                                                                                        • +1
                                                                                                                                          Я думаю, что это мрачное пророчество ещё не скоро сбудется.

                                                                                                                                          Чего-то я не видел, например, баннеров, нарисованных на холсте <canvas> для обхода Adblock Plus.
                                                                                                                                          • 0
                                                                                                                                            Если бы вы это видели, это было бы уже не пророчество а реальность :-)
                                                                                                                                            • +2
                                                                                                                                              утото только потому что в ИЕ не робит. ИЕ больше, чем Адблока
                                                                                                                                              • 0
                                                                                                                                                Для IE вроде есть реализация Canvas на Javascript.
                                                                                                                                          • 0
                                                                                                                                            Я думаю после внедрения веб сокетов и полноценного HTML5 и CSS3 то Google Wave выстрелит так как будет менее ресурсоемкое и более шустрое, да и по идее вебсокеты будут жрать меньше ресурсов сервера да и юзера

                                                                                                                                            Если бы еще по дефолту все бы жалось в gzip…
                                                                                                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                                                            • –1
                                                                                                                                              Не каждый сервер выдержит столько соединений одновременно поддерживать