免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5696 | 回复: 1
打印 上一主题 下一主题

[Redis] WebSockets+Redis构建EventMachine [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-16 19:14 |只看该作者 |倒序浏览
WebSockets+Redis构建EventMachine







EventMachine 是一个Ruby的事件驱动网络库,本文不是要介绍它,而是要介绍一个以Redis 的 Pub/Sub 机制为后端,以WebSockets为前端的类EventMachine实现。

前端代码,创建Socket连接到本地8081端口,当有消息push过来的时候,将消息打印到指定的div里:
  1. <!DOCTYPE html>

  2. <html>
  3. <head>
  4.         <title>Websockets!</title>
  5.         <script>
  6.         function onMessage(evt) {
  7.                 con = document.getElementById("console");
  8.                 con.innerHTML += evt.data;
  9.                 con.innerHTML += '<br />';
  10.         }
  11.         websocket = new WebSocket("ws://localhost:8081");
  12.         websocket.onmessage = function(evt) { onMessage(evt); };
  13.         </script>
  14. </head>

  15. <body>
  16.         <div id="console">
  17.         </div>
  18. </body>
  19. </html>后端代码:

  20. require 'redis'
  21. require 'em-websocket'

  22. SOCKETS = []
  23. @redis = Redis.new(:host => '127.0.0.1', :post => 6379)

  24. # Creating a thread for the EM event loop
  25. Thread.new do
  26.   EventMachine.run do
  27.     # Creates a websocket listener
  28.     EventMachine::WebSocket.start(:host => '0.0.0.0', :port => 8081) do |ws|
  29.       ws.onopen do
  30.         # When someone connects I want to add that socket to the SOCKETS array that
  31.         # I instantiated above
  32.         puts 'creating socket'
  33.         SOCKETS << ws
  34.       end

  35.       ws.onclose do
  36.         # Upon the close of the connection I remove it from my list of running sockets
  37.         puts 'closing socket'
  38.         SOCKETS.delete ws
  39.       end
  40.     end
  41.   end
  42. end

  43. # Creating a thread for the redis subscribe block
  44. Thread.new do
  45.   @redis.subscribe('ws') do |on|
  46.     # When a message is published to 'ws'
  47.     on.message do |chan, msg|
  48.      puts "sending message: #{msg}"
  49.      # Send out the message on each open socket
  50.      SOCKETS.each {|s| s.send msg}
  51.     end
  52.   end
  53. end
复制代码
sleep开启8081端口接受连接,同时连到Redis上订阅ws这个key的消息

当前后端都启动并连接上后,你就可以用如下代码往Redis的ws这个key上写消息,页面上就能看到push过来的消息了:
  1. require 'redis'
  2. @redis = Redis.new(:host => '127.0.0.1', :post => 6379)
  3. @redis.publish 'ws', 'Something witty'
复制代码
来源:jessedearing.com
have fun!

论坛徽章:
0
2 [报告]
发表于 2012-02-17 22:38 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP