<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>по стопам webkill&#039;а &#187; html5</title>
	<atom:link href="http://blog.lukmus.ru/tag/html5/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.lukmus.ru</link>
	<description>это наш химический дом для печальных жителей Земли</description>
	<lastBuildDate>Sat, 21 Oct 2023 19:10:13 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Ruby WS-сервер под HTML5 WebSockets</title>
		<link>http://blog.lukmus.ru/2011/06/16/ruby-ws-server-pod-html5-websockets/</link>
		<comments>http://blog.lukmus.ru/2011/06/16/ruby-ws-server-pod-html5-websockets/#comments</comments>
		<pubDate>Thu, 16 Jun 2011 01:15:41 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[em-http-request]]></category>
		<category><![CDATA[em-websocket]]></category>
		<category><![CDATA[eventmachine]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[websockets]]></category>
		<category><![CDATA[ws]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1009</guid>
		<description><![CDATA[WebSockets &#8211; новая и очень крутая штука в HTML5. В большинстве случаев WS быстрее, легче и эффективнее всяких там AJAX&#8217;ов, не говоря уже о Flash. Подробнее о WebSockets в HTML5 на википедии. Но речь здесь не о HTML5, а больше о сервере под веб-сокеты т.к. они работают не по протоколу HTTP/HTTPS, а по WS/WSS. Разумеется [...]]]></description>
			<content:encoded><![CDATA[<p>WebSockets &#8211; новая и очень крутая штука в HTML5. В большинстве случаев WS быстрее, легче и эффективнее всяких там AJAX&#8217;ов, не говоря уже о Flash. Подробнее о WebSockets в HTML5 на <a rel="nofollow" href="http://ru.wikipedia.org/wiki/WebSocket" target="_blank">википедии</a>. Но речь здесь не о HTML5, а больше о сервере под веб-сокеты т.к. они работают не по протоколу HTTP/HTTPS, а по WS/WSS. Разумеется для всяких там апачей есть вагон модулей для работы с WS на том же порте что и HTTP, однако, может возникнуть ситуация что нужно будет иметь код-сервер (а-ля webrick) реализованный скажем в как cron через rake, я имею ввиду Ruby on Rails разумеется.<br />
<a href="http://blog.lukmus.ru/wp-content/uploads/2011/06/ws.png"><img class="aligncenter size-full wp-image-1010" title="ws" src="http://blog.lukmus.ru/wp-content/uploads/2011/06/ws.png" alt="" width="517" height="324" /></a><span id="more-1009"></span></p>
<h2>суть</h2>
<p>WS-сервер, который рассмотрен здесь, вовсе не сервер типа Apache, а простая библиотека Ruby, которая берет всю заботу о соблюдении норм протокола на себя.</p>
<h2>установка</h2>
<p>Для начала нужно установить компилятор <code>g++</code>, именно его т.к. последующие гемы пользуются им, а не <code>gcc</code>. Не знаю как других дистрах, а в Fedora&#8217;е <code>gcc</code> и <code>g++</code> 2 разных пакета.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">yum install</span> gcc-c++</pre></td></tr></table></div>

<p>Теперь надо установить несколько гемов:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">gem <span style="color: #c20cb9; font-weight: bold;">install</span> eventmachine em-websocket em-http-request</pre></td></tr></table></div>

<p>Официальная страница библиотеки &#8211; <a href="https://github.com/igrigorik/em-websocket" target="_blank">https://github.com/igrigorik/em-websocket</a></p>
<h2>пример</h2>
<h3>серверная часть</h3>
<p>Я взял пример с офстраницы и чуть-чуть его видо изменил, добавив вывод в консоль клиентского сообщения:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'em-websocket'</span>
&nbsp;
<span style="color:#6666ff; font-weight:bold;">EventMachine::WebSocket</span>.<span style="color:#9900CC;">start</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:host</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;0.0.0.0&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:port</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">8080</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>ws<span style="color:#006600; font-weight:bold;">|</span>
  ws.<span style="color:#9900CC;">onopen</span>    <span style="color:#006600; font-weight:bold;">&#123;</span> ws.<span style="color:#9900CC;">send</span> <span style="color:#996600;">&quot;Hi!&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
  ws.<span style="color:#9900CC;">onmessage</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>msg<span style="color:#006600; font-weight:bold;">|</span>
	ws.<span style="color:#9900CC;">send</span> <span style="color:#996600;">&quot;Pong: #{msg}&quot;</span>
	<span style="color:#CC0066; font-weight:bold;">puts</span> msg
  <span style="color:#9966CC; font-weight:bold;">end</span>
  ws.<span style="color:#9900CC;">onclose</span>   <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;WebSocket closed&quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Этот код будет слушать порт 8080 на localhost. Когда к нему присоединяется клиент, то он ему отправляет &#8216;Hi!&#8217;, далее на каждое клиентское сообщение он отвечает эхо-ответом <code>"Pong: #{msg}"</code>.</p>
<h3>клиентская часть</h3>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset='utf-8'/&gt;
&lt;title&gt;ХТМЛ5&lt;/title&gt;
&nbsp;
&lt;script&gt;
&nbsp;
function log(e){
	lg=document.getElementById('log');
	lg.innerHTML=lg.innerHTML+(e+&quot;\r\n&quot;);
}
&nbsp;
w=new WebSocket'ws://localhost:8080'); //создаем сокет
&nbsp;
// при открытии соединения выводим 'open' и
// отправляем 'client open'&lt;/span&gt;
w.onopen=function(){ log(&quot;open&quot;); w.send('client open'); }
&nbsp;
// полученное сообщение выводим
w.onmessage=function&lt;/span&gt;(e){ log(e.data);}
&nbsp;
// при закрытии выводим 'client closed'
w.onclose=function(e){ log(&quot;client closed&quot;);}
&nbsp;
// по нажатию на клавишу отправляем содержимое поля,
// выводим и чистим поле
function oncl(){
 txt=document.getElementById('txt');
 w.send(txt.value); log('-'+txt.value); txt.value=''; }
&lt;/script&gt;
&nbsp;
&lt;/head&gt;
&lt;body&gt;
&lt;input type='button' id='btn' value='ok' onClick='oncl();'&gt;
&lt;input type='text' id='txt' /&gt;
&lt;div id='log' 
  style='border:1px solid black; width:400px; height:500px;'&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p>Разметка представляет из себя поле, кнопку и div 400&#215;500 с черной рамкой, что касается кода, то тут собственно все росписано в комментариях, а если по серьезному то нужно читать <a href="http://dev.w3.org/html5/websockets/" target="_blank">специализацию HTML5 по WebSockets</a>.</p>
<p>P.S. чем больше будет сайтов на HTML5 тем быстрее люди перейдут на него.<br />
<meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2011/06/ws.png" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2011/06/16/ruby-ws-server-pod-html5-websockets/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
