The request/response model
GET /7020c0e8b09f4314ceee7c0ebccaff3fe956da1820.png HTTP/1.1
Host: new.tinygrab.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: image/webp,image/*,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,ru;q=0.6,uk;q=0.4
Cookie: __utma=80076562.1; __utmc=80076562; __utmz=80076562
Request every n seconds
setInterval(function() {
$.ajax({
url: '/server',
dataType: 'json',
success: function () { ... }
})
}, 30000);
Request every n seconds \w wait-delay
a channel over a single TCP connection
ws://
upgrade http to websocket
send data frames in both directions
end the connection
switching the HTTP protocol to WebSocket
each of client & server becomes as peer
only 2 bytes of overhead
no latency for creation new TCP connection
no polling overhead (will send message when it needed)
caniuse.com 89.42%
var ws = new WebSocket('ws://echo.websocket.org');
ws.onopen = function() { ws.send('hi'); }
ws.onmessage = function(event) { console.log('message %s', event.data) }
ws.onclose = function(event) { console.log('closed', event.code) }
Dockerfile:
FROM centos:6
MAINTAINER itspoma <itspoma@gmail.com>
RUN yum clean all \
&& yum install -y git curl wget mc
RUN curl --silent --location https://rpm.nodesource.com/setup | bash - \
&& yum install -y nodejs \
&& npm install -g npm@latest \
&& npm install -g inherits
RUN cd /tmp/ && npm install ws \
&& wget -O /tmp/server.js http://pastebin.com/raw/cUGe4Bgm
Shell instructions:
$ wget -O Dockerfile http://pastebin.com/raw/0Xn5uZxc
$ docker rm -f websocket-container
$ docker rmi -f websocket-image
$ docker build -t websocket-image .
$ docker run --name=websocket-container -p 4871:8080 -tid websocket-image
$ docker exec -ti websocket-container bash
vm$ node /tmp/server.js
vm$ nohup node /tmp/server.js >/dev/null 2>&1 &
var WebSocketServer = require('ws').Server
, wss = new WebSocketServer({ port: 8080 });
wss.broadcast = function (data) {
wss.clients.forEach(function (client) {
client.send(data);
});
};
wss.on('connection', function (ws) {
console.log('new connection');
ws.on('message', function (message) {
console.log('received: %s', message);
wss.broadcast(message);
});
ws.send('something');
});
http://pastebin.com/raw/cUGe4Bgm
var ws = new WebSocket('ws://185.69.152.203:4871');
ws.onopen = function() { ws.send('hi'); }
ws.onmessage = function(event) { console.log('message %s', event.data) }
ws.onclose = function(event) { console.log('closed', event.code) }
ws.send('welcome');
http://jsfiddle.net/7hvph2ob/4/
websocket-based DDP (Distributed Data Protocol)
to fetch structured data from a server,
deliver live updates as data changes,
and for remote procedure call