👏👏👏
哈喽!大家好,我是【太阳打伞】,一位热爱分享各种技术的博主!😍😍😍
⭐【太阳打伞】的创作宗旨:每一条命令都亲自执行过,每一行代码都实际运行过,每一种方法都真实实践过,每一篇文章都良心制作过。✊✊✊
⭐【太阳打伞】的博客中所有涉及命令、代码的地方,除了提供图片供大家参考,另外会在图片下方提供一份纯文本格式的命令或者代码方便大家粘贴复制直接执行命令或者运行代码。🤝🤝🤝
⭐如果你对技术有着浓厚的兴趣,欢迎关注【太阳打伞】,欢迎大家和我一起交流。😘😘😘
❤️❤️❤️感谢各位朋友接下来的阅读❤️❤️❤️
WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。
连接成功状态码
101:HTTP协议切换为WebSocket协议。
| 事件 | 事件处理程序 | 描述 |
| open | Socket.onopen | 连接建立时触发 |
| message | Socket.onmessage | 客户端接收服务端数据时触发 |
| error | Socket.onerror | 通信发生错误时触发 |
| close | Socket.onclose | 连接关闭时触发 |
| 方法 | 描述 |
|---|---|
| Socket.send() | 使用连接发送数据 |
| Socket.close() | 关闭连接 |
-
- 根据token来建立链接信息,需要把当前用户的token传到服务器
-
- "token":localStorage.getItem("token"),
-
-
- //声明一个方法
- init_websocket:function(){
-
- //建立websocket链接
- if("WebSocket" in window){
-
- var ws = new WebSocket("ws://localhost:8000/websocket/?token=" + this.token);
-
- ws.onopen = function(){
-
- //web socket 已连接上,使用send()方法发送数据
-
- console.log("建立链接");
- ws.send("我是前端传来的信息");
- }
-
- ws.onmessage = function(evt){
-
- console.log(evt.data);
-
-
-
- //反序列化
-
-
-
- }
-
-
- alert("数据已接收")
- }
-
- ws.onclose = function(){
-
- //关闭websocket
-
- console.log("链接关闭了")
- }
-
-
-
- }else{
-
- alert("你的浏览器不支持websocket,请更换chrome")
- }
-
-
-
- }
-
1.导入需要使用的模块:
- from tornado.web import url
-
- from functools import wraps
-
-
- from tornado import websocket
-
- from base import BaseHandler
-
- import json
2.写入视图类:
- clients = {}
-
-
-
- async def push_message(uid,message):
-
-
-
- # 查找发送的对象
-
- if uid in clients:
- print(uid,message)
- clients[uid]["connect"].write_message(message)
-
-
-
-
- class BaseWebSocket(websocket.WebSocketHandler):
- def check_origin(self, origin):
- """重写同源检查 解决跨域问题"""
- return True
-
- # 开启链接
- # 进行校验
- @websocket_jwt
- async def open(self):
-
- global clients
-
- # 存储用户链接
- clients[self._cuser.id] = {"connect":self}
-
- print(clients)
- print("开启链接")
-
- # 接收消息
- def on_message(self, message):
- print(message)
-
- # 断开
- @websocket_jwt
- def on_close(self):
-
- del clients[self.self._cuser.id]
- print("链接断开了")
-
-
- class PushWebSocket(BaseHandler):
-
- async def post(self):
-
- uid = self.get_argument("uid")
-
- await push_message(int(uid),"这是后端传来的消息")
-
- self.finish({"errcode":0,'msg':"消息推送成功"})
3.写测试脚本
-
- # token是前端用户的token,已修改,记得用自己的哦
- data = {'uid':16,"token":'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MTZ9.XvNppt0kbk9YdcWE2eT-OS6DZGiHfYLWWY5Qz_lSCpu'}
-
-
-
-
- if __name__ == '__main__':
-
-
- res = requests.post("http://localhost:8000/push/",data=data)
- print(res.text)
4.配置路由
- # 声明路由
- urlpatterns = [
- url('/websocket/', BaseWebSocket),
- url('/push/', PushWebSocket),
-
-
- ]