WebSockets+Redis构建EventMachine
by nosqlfan
at 2011-08-23 14:37:02
original http://item.feedsky.com/~feedsky/nosqlfan/~8149226/549276931/6253001/1/item.html
EventMachine 是一个Ruby的事件驱动网络库,本文不是要介绍它,而是要介绍一个以Redis 的 Pub/Sub 机制为后端,以WebSockets为前端的类EventMachine实现。
前端代码,创建Socket连接到本地8081端口,当有消息push过来的时候,将消息打印到指定的div里:
<!DOCTYPE html> <html> <head> <title>Websockets!</title> <script> function onMessage(evt) { con = document.getElementById("console"); con.innerHTML += evt.data; con.innerHTML += '<br />'; } websocket = new WebSocket("ws://localhost:8081"); websocket.onmessage = function(evt) { onMessage(evt); }; </script> </head> <body> <div id="console"> </div> </body> </html>
后端代码:
require 'redis' require 'em-websocket' SOCKETS = [] @redis = Redis.new(:host => '127.0.0.1', :post => 6379) # Creating a thread for the EM event loop Thread.new do EventMachine.run do # Creates a websocket listener EventMachine::WebSocket.start(:host => '0.0.0.0', :port => 8081) do |ws| ws.onopen do # When someone connects I want to add that socket to the SOCKETS array that # I instantiated above puts 'creating socket' SOCKETS << ws end ws.onclose do # Upon the close of the connection I remove it from my list of running sockets puts 'closing socket' SOCKETS.delete ws end end end end # Creating a thread for the redis subscribe block Thread.new do @redis.subscribe('ws') do |on| # When a message is published to 'ws' on.message do |chan, msg| puts "sending message: #{msg}" # Send out the message on each open socket SOCKETS.each {|s| s.send msg} end end end sleep
开启8081端口接受连接,同时连到Redis上订阅ws这个key的消息
当前后端都启动并连接上后,你就可以用如下代码往Redis的ws这个key上写消息,页面上就能看到push过来的消息了:
require 'redis' @redis = Redis.new(:host => '127.0.0.1', :post => 6379) @redis.publish 'ws', 'Something witty'
来源:jessedearing.com
have fun!
相关文章: |
案例:用Redis来存储关注关系 |
redis 适用场景与实现 |
Redis事件驱动库结构 |
Redis 2.0发布,新功能细数 |
Redis在.NET上的应用教程 |
无觅 |