[19:36][~/srcSTW/streaming/websocketsDrawEM(master)]$ cat -n server.rb
1 require 'em-websocket'
2 require 'json'
3 require 'sinatra/base'
4
5 EventMachine.run {
6 @channel = EM::Channel.new
7 @users = {}
8 @messages = []
9
10 EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|
11
12 ws.onopen {
13 #Subscribe the new user to the channel with the callback function for the push action
14 new_user = @channel.subscribe { |msg| ws.send msg }
15
16 #Add the new user to the user list
17 @users[ws.object_id] = new_user
18
19 #Push the last messages to the user
20 @messages.each do |message|
21 ws.send message
22 end
23 }
24
25 ws.onmessage { |msg|
26
27 #append the message at the end of the queue
28 @messages << msg
29 @messages.shift if @messages.length > 10
30
31 #Broadcast the message to all users connected to the channel
32 @channel.push msg
33 }
34
35 ws.onclose {
36 @channel.unsubscribe(@users[ws.object_id])
37 @users.delete(ws.object_id)
38 }
39 end
40
41 #Run a Sinatra server for serving index.html
42 class App < Sinatra::Base
43 set :public_folder, settings.root
44
45 get '/' do
46 send_file 'index.html'
47 end
48 end
49 App.run!
50 }
!!! 5
%html
%head
%meta(charset="utf-8")
%meta(content="IE=edge,chrome=1" http-equiv="X-UA-Compatible")
%meta(name="viewport" content="width=device-width, user-scalable=0, initial-scale=1.0, maximum-scale=1.0;")
%link(rel="stylesheet" href="http://code.jquery.com/mobile/1.0/jquery.mobile-1.0.min.css")
%script(type="text/javascript" src="http://code.jquery.com/jquery-1.6.4.min.js")
%script(type="text/javascript" src="http://code.jquery.com/mobile/1.0/jquery.mobile-1.0.min.js")
%title
WebSockets Drawing
%body
:javascript
var WebSocket = window.WebSocket || window.MozWebSocket;
$(function() {
var socket = new WebSocket("ws://" + location.hostname + ":8080");
var currentX = 0;
var currentY = 0;
var lastX;
var lastY;
var lastReceivedX;
var lastReceivedY;
var ctx = $('#canvas')[0].getContext('2d');
$('#canvas').bind('vmousemove',function(ev){
ev = ev || window.event;
currentX = ev.pageX || ev.clientX;
currentY = ev.pageY || ev.clientY;
});
socket.onopen = function(event) {
setInterval(function(){
if(currentX !== lastX || currentY !== lastY){
lastX = currentX;
lastY = currentY;
socket.send( JSON.stringify({x:currentX, y: currentY}) );
}
}, 30); // send every 300 milliseconds if position has changed
}
socket.onmessage = function(event) {
var msg = $.parseJSON(event.data);
ctx.beginPath();
ctx.moveTo(lastReceivedX,lastReceivedY);
ctx.lineTo(msg.x,msg.y);
ctx.closePath();
ctx.stroke();
lastReceivedX = msg.x;
lastReceivedY = msg.y;
}
});
%div(data-role="page")
%canvas#canvas(width='1000' height='1000')
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<meta content='IE=edge,chrome=1' http-equiv='X-UA-Compatible' />
<meta content='width=device-width, user-scalable=0, initial-scale=1.0, maximum-scale=1.0;' name='viewport' />
<link href='http://code.jquery.com/mobile/1.0/jquery.mobile-1.0.min.css' rel='stylesheet' />
<script src='http://code.jquery.com/jquery-1.6.4.min.js' type='text/javascript'></script>
<script src='http://code.jquery.com/mobile/1.0/jquery.mobile-1.0.min.js' type='text/javascript'></script>
<title>
WebSockets Drawing
</title>
</head>
<body>
<script type='text/javascript'>
//<![CDATA[
var WebSocket = window.WebSocket || window.MozWebSocket;
$(function() {
var socket = new WebSocket("ws://" + location.hostname + ":8080");
var currentX = 0;
var currentY = 0;
var lastX;
var lastY;
var lastReceivedX;
var lastReceivedY;
var ctx = $('#canvas')[0].getContext('2d');
$('#canvas').bind('vmousemove',function(ev){
ev = ev || window.event;
currentX = ev.pageX || ev.clientX;
currentY = ev.pageY || ev.clientY;
});
socket.onopen = function(event) {
setInterval(function(){
if(currentX !== lastX || currentY !== lastY){
lastX = currentX;
lastY = currentY;
socket.send( JSON.stringify({x:currentX, y: currentY}) );
}
}, 30); // send every 300 milliseconds if position has changed
}
socket.onmessage = function(event) {
var msg = $.parseJSON(event.data);
ctx.beginPath();
ctx.moveTo(lastReceivedX,lastReceivedY);
ctx.lineTo(msg.x,msg.y);
ctx.closePath();
ctx.stroke();
lastReceivedX = msg.x;
lastReceivedY = msg.y;
}
});
//]]>
</script>
<div data-role='page'>
<canvas height='1000' id='canvas' width='1000'></canvas>
</div>
</body>
</html>
|
[scale=0.7]sinatra/chapter2fundamentos/websockets.png
|