websocket
01 长轮询
在网页,我们经常扫码登录,结合之前的学习的知识点,来思考下,前端是如何知道用户在手机上扫码登录了呢?
长轮询:客户端不断的向服务器发送请求
缺点:
\1. 开销大
\2. 浪费资源
\3. 消耗流量
02 websocket介绍
长轮询消耗太多资源,其中主要原因是客户端和服务端并没有一直连接在一起,如果能够让客户端和服务器一直保持连接呢?
正经介绍
WebSocket 协议是基于 TCP 的一种新的 HTML5 网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范
简单说:客户端和服务器一直连接在一起
03 websocket**服务端编程**
第一步:导入
import tornado.websocket
第二步:基类
class BaseWebSocketHandler(tornado.websocket.WebSocketHandler, SessionMixin):
def get_current_user(self):
current_user = self.session.get('user')
if current_user:
return current_user
else:
return None
第三步:跳转 Handler
class IndexHandler(BaseHandler):
@authenticated
def get(self):
self.render('08websocket.html')
第四步: websocket**的Handler**
class MessageWSHandler(BaseWebSocketHandler):
users = set()
def open(self):
MessageWSHandler.users.add(self)
def on_message(self, message):
for u in self.users:
u.write_message('%s-%s-说:%s' % ( self.current_user, datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), message ))
def on_close(self):
if self in MessageWSHandler.users:
MessageWSHandler.users.remove(self)
websocket
Tornado 定义了 tornado.websocket.WebSocketHandler 类用于处理 WebSocket 链接的请求,应用开发者应该继承该类并实现其中的open()、on_message()、on_close() 函数
除了这3个 Tornado 框架自动调用的入口函数,WebSocketHandler 还提供了两个开发者主动操作 WebSocket的函数:
WebSocketHandler.write_message**(message)**函数:用于向与本链接相对应的客户端写消息
WebSocketHandler.close**(code=None,reason=None)**函数:主动关闭 WebSocket链接。其中的code和reason用于告诉客户端链接被关闭的原因。参数code必须是一个数值,而reason是一个字符串。
04 webscoket 客户端编程
WebSocket
WebSocket 是 HTML5 的标准之一,因此主流浏览器的 web 客户端编程语言 Javascript 已经支持 WebSocket 的客户端编程
初始化 WebSocket 对象
var socket = new WebSocket(url ):
处理函数
WebSocket.onopen : 此事件发生在 WebSocket 链接建立时
WebSocket.onmessage : 此事件发生在收到了来自服务器的消息时
WebSocket.onclose : 此事件发生在与服务器的链接关闭时
WebSocket.onerror : 此事件发生在通信过程中有任何错误时
主动操作**函数**
WebSocket.send**(data)** :向服务器发送消息
WebSocket.close**()** :主动关闭现有链接
self.request.remote_ip