前段时间项目要实现群聊系统,项目是ruby on rails写的,后来就选择了faye,faye是一个实时推送的服务器,如果不知道faye,建议去官网了解下,http://faye.jcoglan.com/ 折腾了挺长时间,记录一下遇到的坑,以防以后在碰到了,或者能给需要的人看。碰到最大的坑就是要标记在线用户的信息。
首先在Gemfile 中添加
gem 'faye-rails'
gem 'thin' //我用的是通过thin来跑的服务器
并且在applation.js中添加
//=require faye
我一开始是通过在applation.rb中进行配置让faye 和rails一起启动,本地跑的没有问题,但通过nginx部署到服务器的时候会开启不了服务,后来我把faye server独立出来,在工程目录下新建faye.ru文件,文件噢诶之如下
require 'faye' require File.expand_path('../config/initializers/faye_token.rb', __FILE__) require 'active_record' require 'mysql2' require 'yaml' Faye::WebSocket.load_adapter('thin') RAILS_ENV = ENV['RACK_ENV'] require File.expand_path('../app/models/user_chat_room.rb', __FILE__) environment = ENV['RACK_ENV'] || 'production' dbconfig = YAML.load(File.read('config/database.yml')) //添加database ActiveRecord::Base.establish_connection(dbconfig[environment]) faye_server = Faye::RackAdapter.new(:mount => '/faye', :timeout => 60) // class MarkOnline def incoming(message, callback) faye_client ||= Faye::Client.new('http://localhost:9292/faye') if message['channel'] == '/meta/subscribe' if message['data'] != nil UserChatRoom.mark_on_line( message['data']['user'], //登陆上线 message['data']['id'], message['data']['sex'], message['clientId'] ) online_user = UserChatRoom.current_online faye_client.publish('/message', online_user) //把上线人的信息push给所有人 end elsif message['channel'] == '/meta/disconnect' UserChatRoom.mark_off_line(message['clientId']) online_user = UserChatRoom.current_online //下线 faye_client.publish('/message', online_user) end callback.call(message) end end faye_server.on(:disconnect) do |client_id| //每60秒监测一次,如果连接已断,把这个人的信息删除下线 UserChatRoom.mark_off_line(client_id) faye_client ||= Faye::Client.new('http://localhost:9292/faye') online_user = UserChatRoom.current_online faye_client.publish('/message', online_user) end faye_server.add_extension(MarkOnline.new) run faye_server
applation.html.erb中添加
<%= javascript_include_tag 'application',"http://#{request.host}:9292/faye.js" 'data-turbolinks-track' => true %>
前台js
client = new Faye.Client('http://' + document.domain + ':9292' + '/faye'); // new 监听事件
client.subscribe('/chat', function (payload) { //接收server传来的消息 } client.publish('/chat', { //向server push消息 });
后来又为聊天添加了表情,以及图片,原理都一样,图片是通过二进制流来传输,表情就是类似chat表情一样,参考的文章是nodejs
http://www.cnblogs.com/wayou/p/hichat_built_with_nodejs_socket.html
相关推荐
这是一个演示,展示了如何将 faye 配置为在您的 Rails 应用程序中作为中间件运行。 你可以在heroku 上看到这个 repo 的现场演示 一体化 将 faye 和 thin 添加到Gemfile gem 'faye' gem 'thin' 在config/...
本文将深入探讨一个基于Rails的聊天应用——Chat-App,它采用private_pub gem实现了一个类似Gmail的聊天体验。 首先,我们要理解Chat-App的核心组件——private_pub gem。这是一个由Ryan Bates开发的Rails gem,...
铁轨实时聊天集成配置基本 rails 应用程序并安装 faye 和 Thin gem 将使您第一次接触到您的聊天应用程序。 Faye js 文件应该在项目根目录下。 Faye.ru 文件将配置与 faye 相关的所有路径。 配置文件夹中 faye 所需的...
您很可能将它与 Rails private_pub gem 一起使用。 请参阅包含的 .env.example 文件。 启动开发服务器:pm2 start server.js --name privatepub 停止服务器:pm2 stop privatepub 部署到 Ubuntu 创建一个 ...
实时支持Rails 注意:此gem是最初在2013年构思并在2014年初作为通用开源项目发布的概念作品。 从2015年中期开始,Rails中将提供对性能,本机和可扩展WebSocket的支持。 看到降落在Rails 5中,可能会在2016年初/中期...
gem 'faye-websocket' gem 'thin' # If not already done 创建一个config/initializers/thin_action_cable.rb : Rails . application . config . action_cable . use_faye = true Faye :: WebSocket . load_...
Ruby on Rails通常与SQLite、MySQL或PostgreSQL等数据库系统配合使用。理解ActiveRecord(Rails的ORM)以及如何设计数据库模型和关系至关重要。 6. **安全性与身份验证**:为了保护用户的安全,项目需要实现用户...
此外,这个聊天应用可能使用了某个 WebSocket 框架,如 ActionCable(Ruby on Rails 的一部分),或者独立的库如 Faye 或 Pusher。这些框架帮助处理 WebSocket 连接的生命周期,广播消息,并提供订阅/发布机制。 ...