tornado框架基础10-websocket

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

猜你喜欢

转载自www.cnblogs.com/winfun/p/10974278.html
今日推荐