4-2 什么是WebSocket; Action Cable的使用。Rails guide-6.3视频教学,没有看!
WebSocket
WebSocket是一种在单个TCP连接上进行全双工通讯的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
背景:
现在,很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
在这种情况下,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
优点:
- 较少的控制开销。在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小
- 更强的实时性。由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少
- 保持连接状态。于HTTP不同的是,Websocket需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。
https://zh.wikipedia.org/wiki/WebSocket
Action Cable
1. a thick strong metal rope used on ships, to support bridges etc
通过提供Client Javascript框架和Server端Ruby框架把 WebSocket协议和Rails应用集成起来。
2. Publish-Subscribe功能
指定好发布者和订阅者,之后发布者自动发送新数据给订阅者。比传统方式高效。
3 Server-Side Components
3.1 Connections 第一步连接设置。
Connections are instances of ApplicationCable::Connection.对连接的授权就是在这个类中完成的,对能够识别的用户会建立 consumer-connection pair.
identified_by(*identifiers)中的核心语法是:attr_accessor identifier, 就是建立一个存取宏, 产生一个实例名字和存取它的方法。然后把它放入这个数组集合中。
def identified_by(*identifiers)
Array(identifiers).each { |identifier| attr_accessor identifier }
self.identifiers += identifiers
end
3.2 Channels
类似controller做的标准MVC步骤。
http://api.rubyonrails.org/classes/ActionCable/Channel/Base.html (api)
Rails creates ApplicationCable::Channel class 封装共享的逻辑在你的各channels.
3.21 Parent Channel Setup
你自己创建自己的channel类,继承它。 命令:rails generate channel products。
pasting
在类中定义订阅subscribed
,取消订阅,拒绝订阅reject(资质审核)等10多个方法。
# app/channels/chat_channel.rb
class ChatChannel < ApplicationCable::Channel # 当用户成为此频道的订阅者时调用
def subscribed
。
end
end
4 Client-Side Components
4.1 Connections
Consumers require an instance of the connection on their side. This can be established using the folling JavaScript, which is generated by default by Rails :
4.11 Connect Consumer
identical app/assets/javascripts/cable.js
4.12 Subscriber
A consumer becomes a subscriber by creating a subscription to a given channel:
create app/assets/javascripts/channels/products.coffee
5. Client-Server Interactions 交互
create app/channels/products_channel.rb
5.1 Streams
Streams provide the mechanism by which channels route published content (broadcasts) to their subscribers.
如果和模型关联的流,用stream_for
class CommentsChannel < ApplicationCable::Channel
def subscribed
post = Post.find(params[:id])
stream_for post
end
end
向评论频道发送广播的方式如下:
CommentsChannel.broadcast_to(@post, @comment)
发生命名的广播用stream_from ,见api
流的方法:
5.2 Broadcasting
A broadcasting is a pub/sub link
CommentsChannel.broadcast_to(@post, @comment)
5.3 Subscriptions
This Connection is called a subscription. Incoming messages are then routed to these channel subscriptions based on an identifier sent by the cable consumer.
5.4 Passing Parameters to Channels
You can pass para from the client side to the server side when creating a subscriptin. For example:
def subscribed stream_from "chat_#{params[:room]}" end5.5 Rebroadcasting a Message
A common use case is to rebroadcast a message sent by one client to any other connected clients.
def receive(data) ActionCable.server.broadcast("chat_#{params[:room]}", data) endThe rebroadcast will be received by all connected clients, including the client that sent the message. Note that params are the same as they were when you subscribed to the channel.
一个基础功能演示的案例(不包含connection.rb)
https://www.cnblogs.com/chentianwei/p/9296887.html
使用broadcast功能渲染首页部分页面:
3步骤:第一建立频道,第二发送这个频道的信息,第三选择接收信息的位置。
⚠️本案例没有涉及到用户对平淡的订阅和连接。即在assets/channels/XXX_channel.rb 中设置连接。
https://github.com/rails/actioncable-examples
完全的案例:
需要按照redis数据库。简介:Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。菜鸟教程(redis)
4-2 什么是WebSocket; Action Cable的使用。Rails guide-6.3视频教学,没有看!的更多相关文章
- 实时更新数据,无需刷新:a,如何使用Turbolinks clearCache(), b Action Cable
视频: https://gorails.com/episodes/how-to-use-turbolinks-clearCache?autoplay=1 用途: 更方便的实时从服务器更新局部网页,在这 ...
- 使用WebSocket实现服务端和客户端的通信
开发中经常会有这样的使用场景.如某个用户在一个数据上做了xx操作, 与该数据相关的用户在线上的话,需要实时接收到一条信息. 这种可以使用WebSocket来实现. 另外,对于消息,可以定义一个类进行固 ...
- 刨根问底 HTTP 和 WebSocket 协议(上)
HTTP vs WebSocket 那天和boss聊天,不经意间提到了Meteor,然后聊到了WebSocket,然后就有了以下对话,不得不说,看问题的方式不同,看到的东西也会大不相同. A:Mete ...
- websocket可以做什么
本篇介绍的是websocket,但是并不介绍它的协议格式,一般能看明白http头也能明白websocket在协议切换前的协商,能看明白IP报头也就对websocket在协议切换后通讯格式不陌生.web ...
- Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...
- Web APi之控制器选择Action方法过程(九)
前言 前面我们叙述了关于控制器创建的详细过程,在前面完成了对控制器的激活之后,就是根据控制器信息来查找匹配的Action方法,这就是本节要讲的内容.当请求过来时首先经过宿主处理管道然后进入Web AP ...
- 借助node实战WebSocket
一.WebSocket概述 WebSocket协议,是建立在TCP协议上的,而非HTTP协议. 如下: ws://127.0.0.1或wss://127.0.0.1就是WebSocket请求. 注:w ...
- Struts2 源码分析——Action代理类的工作
章节简言 上一章笔者讲到关于如何加载配置文件里面的package元素节点信息.相信读者到这里心里面对struts2在启动的时候加载相关的信息有了一定的了解和认识.而本章将讲到关于struts2启动成功 ...
- Struts2 源码分析——调结者(Dispatcher)之执行action
章节简言 上一章笔者写关于Dispatcher类如何处理接受来的request请求.当然读者们也知道他并非正真的执行action操作.他只是在执行action操作之前的准备工作.那么谁才是正真的执行a ...
随机推荐
- CHM无法正常显示的问题
很喜欢看CHM电子书,感觉篇幅不是很长,而且可以索引:但是昨天遇到这个问题: 打开文件的时候发现: 很喜欢看CHM电子书,感觉篇幅不是很长,而且可以索引:但是昨天遇到这个问题: 打开文件的时候发现: ...
- caffe 中base_lr、weight_decay、lr_mult、decay_mult代表什么意思?
在机器学习或者模式识别中,会出现overfitting,而当网络逐渐overfitting时网络权值逐渐变大,因此,为了避免出现overfitting,会给误差函数添加一个惩罚项,常用的惩罚项是所有权 ...
- python 跳过可迭代对象的开始部分
想遍历一个可迭代对象,但是它开始的某些元素你并不感兴趣,想跳过它们 itertools 模块中有一些函数可以完成这个任务.首先介绍的是itertools.dropwhile() 函数.使用时,你给它传 ...
- Python: re.IGNORECASE 标志参数字符串忽略大小写的搜索替换
为了在文本操作时忽略大小写,需要在使用re 模块的时候给这些操作提供re.IGNORECASE 标志参数.比如 >>> text = 'UPPER PYTHON, lower pyt ...
- C/C++之Memcpy and memmove
memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中. 但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开 ...
- 20145127 《Java程序设计》第五次实验报告
实验简述: 在本周,我们进行了Java的第五次试验,本次实验的主要内容是结对编程.本次实验的大体过程是: 1.先进行Java的客户端与服务端的代码编写.结对是两个人,一人负责客户端,一人负责服务端. ...
- 20145332卢鑫 WEB安全基础实验
20145332 WEB安全基础实验 实验过程 ·SQL字符串注入 ·Database Backdoors step1 ·Database Backdoors step2 ·Phishing with ...
- Android实践项目汇报总结(上)修改
微博客户端的设计与实现(上) 第一章 绪论 1.1课题背景 微博可以说是时下最受人们所喜爱的一种社交方式,它是一种通过关注机制分享简短实时信息的广播式的社交网络平台.通过微博我们可以了解最新的时事新闻 ...
- 获取GetOpenFileName多选文件名
void CWriteWnd::OpenFileDialog() { OPENFILENAME ofn; TCHAR szOpenFileNames[*MAX_PATH] = _T("&qu ...
- require的压缩命令
注意点 node r.js -o baseUrl=js name=main out=js/build.js paths.jquery=empty: 注:baseUrl是可选的 取决于页面是否有写这个入 ...