Websocket&WebSSH

什么是WebSSH?

  • webssh 泛指一种技术可以在网页上实现一个 SSH 终端
  • ssh终端:用来通过ssh协议,连接服务器进行管理
  • 运维开发方向:堡垒机登录、线上机器管理(因为运维人员不可能24小时携带电脑)
  • 在线编程:提供一个编程环境

WebSSH是一个简单的Web SSH客户端,用作连接到SSH服务器的SSH客户端。它是用Python编写的,基于tornado,paramiko和xterm.js,特征如下:

  • 支持SSH密码验证,包括空密码。
  • 支持SSH公钥认证,包括DSA RSA ECDSA Ed25519密钥。
  • 支持加密密钥。
  • 支持双因素身份验证(基于时间的一次性密码)。
  • 支持全屏终端。
  • 终端窗口可调整大小。
  • 自动检测ssh服务器的默认编码。
  • 现代浏览器支持Chrome,Firefox,Safari,Edge,Opera。

WebSSH是如何工作的?

123 ±--------+ http ±-------+ ssh ±----------+|
browser | <====> | webssh | <=> | ssh server|±--------+
websocket ±-------+ ssh ±----------+

WebSSH安装
Python 2.7 / 3.4 +

  1. 安装此应用程序,运行命令 pip install webssh
  2. 启动Web服务器,运行命令 wssh
  3. 打开浏览器,导航到 127.0.0.1:8888
  4. 输入您的数据,提交表格。

websocket

什么是websocket

  • webSocket是一种在单个TCP连接上进行全双工通信的协议
  • 客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。
  • 浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输

远古时期解决方案就是轮训
客户端以设定的时间间隔周期性地向服务端发送请求,频繁地查询是否有新的数据改动(浪费流量和资源)

webSocket应用场景?
聊天软件:
最著名的就是微信,QQ,这一类社交聊天的app
弹幕:
各种直播的弹幕窗口
在线教育:
可以视频聊天、即时聊天以及其与别人合作一起在网上讨论问题…

websocket与http区别

  • http请求建立连接只能发送一次请求
  • websocket建立的长连接,一次连接,后续一直通信,这样节省资源

websocket原理

  • websocket首先借助http协议(通过在http头部设置属性,请求和服务器进行协议升级,升级协议为websocket的应用层协议)
  • 建立好和服务器之间的数据流,数据流之间底层还是依靠TCP协议;
  • websocket会接着使用这条建立好的数据流和服务器之间保持通信
  • 由于复杂的网络环境,数据流可能会断开,在实际使用过程中,我们在onFailure或者onClosing回调方法中,实现重连

webSocket使用说明

1. 如果你想为一个单独的视图处理一个websocklet连接可以使用accept_websocket装饰器,它会将标准的HTTP请求路由到视图中。

2. 使用require_websocke装饰器只允许使用WebSocket连接,会拒绝正常的HTTP请求。

3. 在设置中添加设置MIDDLEWARE_CLASSES=dwebsocket.middleware.WebSocketMiddleware这样会拒绝单独的视图实用websocket,必须加上accept_websocket 装饰器。

4. 设置WEBSOCKET_ACCEPT_ALL=True可以允许每一个单独的视图实用websockets

3.图解http与webSocket比较

  • 浏览器通过 JavaScript 向服务端发出建立 WebSocket 连接的请求
  • 在 WebSocket 连接建立成功后,客户端和服务端就可以通过 TCP连接传输数据。
  • 因为WebSocket 连接本质上是 TCP 连接,不需要每次传输都带上重复的头部数据
      在这里插入图片描述

Django的Websocket

1)dwebsocket介绍

1. dwebsocket 是一个在 django 用来实现 websocket 服务端的三方模块,使用上手非常简单

2. 安装方式如下:pip install dwebsocket

3. git 地址:https://github.com/duanhongyi/dwebsocket

2)dwebsocket方法

首先是两个基本的装饰器,用来限定过滤 websocket 的连接

dwebsocket.accept_websocket # 允许 http 与 websocket 连接
dwebsocket.require_websocke # 只允许 websocket 连接

1.request.is_websocket() :如果是个websocket请求返回True,如果是个普通的http请求返回False,可以用这个方法区分它们。
2.request.websocket() :websocket请求建立之后,有一个websocket属性,如果request.is_websocket()False,这个属性将是None3.WebSocket.wait() :返回一个客户端发送的信息,在客户端关闭连接之前他不会返回任何值,这种情况下,方法将返回None
4.WebSocket.read() :如果没有从客户端接收到新的消息,read方法会返回一个新的消息,如果没有,就不返回。这是一个替代wait的非阻塞方法
5.WebSocket.count_messages() :返回消息队列数量
6.WebSocket.has_messages() : 如果有新消息返回True,否则返回False
7.WebSocket.send(message) :向客户端发送消息
8.WebSocket.__iter__() :websocket迭代器

HTML的Websocket

1)响应事件

复制代码
# 1. 创建一个WebSocket连接
var ws = new WebSocket("ws://127.0.0.1:8001/echo")

# 2. ws.onopen方法(当 ws 连接建立时触发)
ws.onopen = function () {
    console.log('WebSocket open');   //成功连接上Websocket
};

# 3. 当 ws 连接接收到数据时触发
ws.onmessage = function (e) {
    console.log('message: ' + e.data);  //打印出服务端返回过来的数据
};

# 4. 当 ws 连接发生通信错误时触发
ws.onerror = function () {
    console.log('连接出错');
};

# 5. 当连接关闭时触发
ws.onclose = function(){
    console.log('连接关闭')
}

2)方法

ws.send(str) // 通过ws连接发送数据
ws.close() // 关闭ws连接

Websocket心跳包机制

心跳包的意义

1. 在使用websocket的过程中,有时候会遇到网络断开的情况,但是在网络断开的时候服务器端并没有触发onclose的事件。

2. 这样会有:服务器会继续向客户端发送多余的链接,并且这些数据还会丢失。

3. 所以就需要一种机制来检测客户端和服务端是否处于正常的链接状态。

4. 因此就有了websocket的心跳了,还有心跳,说明还活着,没有心跳说明已经挂掉了

websocket实现心跳检测的思路

  • 通过setInterval定时任务每个3秒钟调用一次reconnect函数
  • reconnect会通过socket.readyState来判断这个websocket连接是否正常
  • 如果不正常就会触发定时连接,每4s钟重试一次,直到连接成功
  • 如果是网络断开的情况下,在指定的时间内服务器端并没有返回心跳响应消息,因此服务器端断开了。
  • 服务断开我们使用ws.close关闭连接,在一段时间后,可以通过 onclose事件监听到。

原址参考于此

发布了25 篇原创文章 · 获赞 11 · 访问量 901

猜你喜欢

转载自blog.csdn.net/weixin_45139342/article/details/104563945
今日推荐