Pusher
pusher(websocket第三方平台) 使用
1. pusher
pusher 是在看peatio源码的时候接触到的一个第三方websocket中转服务商,避免了自己单独搭建websocket服务器的概念和原理都很不错,是一个很不错的平台。
2. 使用
2.1 创建 pusher.rb –server 端
require 'pusher'
Pusher.url = Settings.pusher_url
pusher_url = "https://#{key}:#{secret}@api.pusherapp.com/apps/#{app_id}"
# or
Pusher.app_id = 'your-pusher-app-id'
Pusher.key = 'your-pusher-key'
Pusher.secret = 'your-pusher-secret'
Pusher.encrypted = true
2.2 创建channel & event
<!DOCTYPE html>
<head>
<title>Pusher Test</title>
<script src="https://js.pusher.com/3.0/pusher.min.js"></script>
<script>
// Enable pusher logging - don't include this in production
Pusher.log = function(message) {
if (window.console && window.console.log) {
window.console.log(message);
}
};
var pusher = new Pusher('5ed6030e7452e4b57957', {
encrypted: true
});
var channel = pusher.subscribe('test_channel');
channel.bind('my_event', function(data) {
alert(data.message);
});
</script>
</head>
2.3 push message
pusher_client.trigger('test_channel', 'my_event', {
message: 'hello world'
})
3 技巧
3.1 pusher channel 的类型
3.1.1 public
对所有人开放,即不需要认证。
3.1.2 private
对socket需要认证。创建的channel名字必须是”private-“开头
3.1.3 presence
在私有的基础上面,可以获取到在某个channel上面的所有在线用户的相关信息(members.count、members.each、members.get(userId)、members.me等等)。创建的channel名字必须是”presence-“开头。
备注: 认证相关
3.2 定制socket方式
websocket 有emit/send/broadcast三种方式
### send
Pusher.trigger('pay_channel', 'pay_notify', { message: 'pay success!!' })
### broadcast
var pusher = new Pusher('5ed6030e7452e4b57957', {
encrypted: true
});
var socketId = null;
pusher.connection.bind('connected', function() {
socketId = pusher.connection.socket_id;
var channel = pusher.subscribe('pay_channel' + socketId);
channel.bind('pay_notify', function(data) {
alert(data.message);
});
console.log(socketId);
});
#此处的socket_id 可有client通过ajax来获得。发给除了自己以外的所有人
Pusher.trigger('pay_channel186586.403132', 'pay_notify', { message: 'pay success ???? ' }, { socket_id: '186674.374456' })
特别说明如果想要push到单独某个client的时候可以采用如下方式(参考peatio):
-
gon,在网页加载之前生成一个唯一的channel,单独为某个用户开设,binding的event还是之前的逻辑。
-
在client绑定这个通过gon获取来的private-channel-id,如果有需要并完成auth。
-
服务器push 参数
Pusher.trigger(xxxxxx)
# or using workers,可使用如下方法
Pusher.get_async
Pusher.post_async
Pusher.trigger_async