阅读本文大概需要 3.6 分钟。

最近一两年一直在使用 Python,使用体验从最开始的惊喜有趣,到后面的简简单单,一路走来收获颇多。现如今仍旧保持好奇心,遇到自己觉得新鲜的就去思考它是如何实现的,这种好奇心驱使着我不断求知,嗯,程序员的生活就是这么朴实无华,平淡无奇。

之前我一直好奇于 Jupyter Notebook 是怎么实现一个远程终端的。

使用 Django、Django rest framework 的感受是:HTTP 协议真的流弊,基本解决了我们遇到的客户端服务器的通信问题,直到使用了 Jupyter NoteBook 的 terminal 功能之后,我开始反思,为什么这个 Jupyter 可以让 linux 的本地 terminal 运行在浏览器上?如果要服务器源源不断的向客户端返回数据,使用 HTTP 实现的话,除了处理不停的刷新请求,应该没有别的好办法。

好奇的我打开了谷歌浏览器的开发者工具,发现 terminal 的 js 源码中有这一段:

......function make_terminal(element, ws_url) {var ws = new WebSocket(ws_url);Terminal.applyAddon(fit);var term = new Terminal();ws.onopen = function(event) {term.on('data', function(data) {ws.send(JSON.stringify(['stdin', data]));});term.on('title', function(title) {document.title = title;});term.open(element);term.fit();// send the terminal size to the server.ws.send(JSON.stringify(["set_size", term.rows, term.cols,window.innerHeight, window.innerWidth]));ws.onmessage = function(event) {var json_msg = JSON.parse(event.data);switch(json_msg[0]) {case "stdout":term.write(json_msg[1]);break;case "disconnect":term.write("\r\n\r\n[CLOSED]\r\n");break;}};};return {socket: ws, term: term};}
......

这便是 WebSocket 客户端应用的典型代码。也许你也想知道,既然已经有了 HTTP 协议,为什么还需要 WebSocket?它能带来什么好处?

WebSocket Vs HTTP

我查了下资料,答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起,当客户端与服务器需要频繁通信时,HTTP 协议非常低效,为什么低效?因为 HTTP 接口之下是 TCP/TSL 套接字(Socket)连接。每一次请求,通常都会重新建立一次 TCP/TSL 握手;在请求结束之后,断开这个链接,也许你听说过面试常问的“TCP 协议的三次握手和四次分手”,这个过程,比我们想象的要慢很多。

而 WebSocket 是一种在单个 TCP/TSL 连接上,进行全双工、双向通信的协议。WebSocket 可以让客户端与服务器之间的数据交换变得更加简单高效,服务端也可以主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就可以直接创建持久性的连接,并进行双向数据传输。对于 web terminal 这种应用,WebSocket 就非常高效。

说到这里,也许你了解到 WebSocket 可以全双工通信,但还不知道要不要用 WebSocket,那么我先问你两个问题:

•你的应用提供多个用户相互交流吗?

•你的应用是展示服务器端经常变动的数据吗?

如果你的答案是肯定的,那么请学习 WebSocket 并尽情的使用吧,如果是否定的,那么可以看下典型的 7 个使用场景,在大脑里留个印象:

1.社交订阅,多人聊天

2.多玩家游戏

3.协同编辑,在线文档

4.流式数据,股票 K 线

5.在线教育

6.基于位置的应用

7.实时监控

下面是 WebSocket 的一些工具介绍

1、WebSocket 服务器:Websocketd。

一个命令行的 WebSocket 服务器,它的最大特点,就是后台脚本不限语言,标准输入(stdin)就是 WebSocket 的输入,标准输出(stdout)就是 WebSocket 的输出,因此,只要你可以写程序从标准输入读取数据,并写入标准输出,你就将你的程序作为 WebSocket 服务器,因此,你可以使用任何编程语言,Python, Ruby, Perl, Bash, .NET, C, Go, PHP, Java, Clojure, Scala, Groovy, Expect, Awk, VBScript, Haskell, Lua, R 都可以。举个例子:

你的 shell 程序:

#!/bin/bash
for((COUNT =1; COUNT <=10; COUNT++));doecho $COUNTsleep 1
done

执行该程序:

$ chmod +x count.sh
$ ./count.sh
1
2
3
4
5
6
7
8
9
10

然后将 count.sh 作为服务器的处理逻辑。

$ websocketd --port=8080./count.sh

编写前端页面 test.html:

<!DOCTYPE html>
<preid="log"></pre>
<script>
// helper function: log message to screen
function log(msg){document.getElementById('log').textContent += msg +'\n';
}// setup websocket with callbacks
var ws =newWebSocket('ws://localhost:8080/');ws.onopen =function(){log('CONNECT');
};ws.onclose =function(){log('DISCONNECT');
};ws.onmessage =function(event){log('MESSAGE: '+event.data);
};
</script>

浏览器打开 test.html 你就会发现程序的标准输出打印在浏览器了。

github 链接「阅读原文可以访问文中的链接」:

https://github.com/joewalnes/websocketd

14.6K Star。

2、把你的 terminal 搬到浏览器上:gotty

gotty 可以实现 Jupyter Notebook terminal 一样的功能,而且可以自由定制。

用法

Usage: gotty [options]<command>[<arguments...>]

默认情况下,GoTTY 不允许客户端发送任何按键或命令(终端窗口大小调整除外)。如果要允许客户将输入写入TTY,请添加该 -w 选项。

但是,对于大多数命令来说,接受来自远程客户端的输入是危险的。当出于某些原因需要与 TTY 进行交互时,请考虑使用 tmux 或 GNU Screen 启动 GoTTY并在其上运行命令(有关详细信息,请参见“与多个客户端共享”部分)。

要限制客户端访问,可以使用该 -c 选项启用基本身份验证。使用此选项,客户端需要输入指定的用户名和密码才能连接到 GoTTY 服务器。请注意,凭据将以纯文本格式在服务器和客户端之间传输。要进行更严格的身份验证,请考虑以下所述的SSL / TLS客户端证书身份验证。

该 -r 选项是一种比较随意的方式来限制访问。使用此选项,GoTTY 会生成一个随机 URL,以便只有知道该 URL 的人才能访问服务器。

github 链接:

https://github.com/yudai/gotty

13.9k Star

3、WebSocket 教程

易学易用的 WebSocket 教程,前端使用 html5, 后端使用 Python 的 pywebsocket:https://www.runoob.com/html/html5-websocket.html

如果您对文章感兴趣,请给予「关注」或「在看」支持。微信搜索「Python七号」并关注,获取一手原创干货。

既生 HTTP 何生 WebSocket ?相关推荐

  1. 小学生计算机舞蹈,最近“泼水成画”很火?舞蹈生VS体育生,看到计算机:你是来添乱的?...

    最近泼水拍照非常的流行,不知道大家在私底下有没有关注过这个视频,而且在这个视频中,这些花放在水里确实也特别的好看,接下来就一起来看一下,不同的学生拍出来的泼水照片都是什么样的. 首先大家看到的就是舞蹈 ...

  2. 既生瑜何生亮 access_token VS refresh_token

    中国有句老话, 既生瑜何生亮, 既然有我周瑜在世, 为什么老天还要一个诸葛亮啊? 同样的, 众所周知, 在 OAuth 2.0 授权协议中, 也有两个令牌 token , 分别是 access_tok ...

  3. excel如何找到高频词_拟录取后:应届生和往届生档案哪里找;重灾院校区;高频词背诵表...

    今日消息1.应届生和往届生档案哪里找?2.重灾院校区3.考研云督学班高频词背诵表汇总1.应届生和往届生档案哪里找? 往年这个时候论文答辩.复试已经结束,已经进入毕业季!现在你们毕业答辩结束了吗?你们都 ...

  4. python 数学基础_Python3数学基础 - 随笔分类 - 既生喻何生亮 - 博客园

    本系列主要集中于数学知识点,利用python编程描述以往学过的数学知识. 摘要:Kronecker delta 克罗内克函数 Wiki "维基百科" Kronecker delta ...

  5. 转贴:既生瑜何生亮:FreeBSD与Linux再比较

    原贴:http://www.phpchina.com/8051/viewspace_8240.html 传说中FreeBSD比linux稳定,大型网站几乎都建立在FreeBSD系统上,我一直疑惑难道l ...

  6. 计算机系男生生的都是女儿吗,IT男只能生女孩,生男孩几率很小吗?

    "IT男"即指男性网络编辑员.计算机维修工.数据库系统管理员.游戏程序开发师等,"IT"系信息技术.互联网技术.信息论等的缩写.据业内人士传辐射会降低精子活力, ...

  7. 应届生和往届生,报名条件区别汇总!

    即将预报名,今天给大家整理了一下应届生和往届生报名需要注意的点.填写信息和报名需要的材料,大家一定要认真对待. 1 关于应届生和往届生身份确认 应届生是指2022年的毕业生,含普通高校.成人高校.普通 ...

  8. 应届生和往届生,谁更容易考研成功?

    据教育部统计,2017年共201万人报考,其中,应届考生113万人,往届考生88万人:2018年共238万人报考,其中,应届考生131万人,往届考生107万人.从数据可知,2017年,往届生考研人数占 ...

  9. 计算机往届生考研失败找工作,终于发现应届生和往届生考研复试会被歧视吗-考研复习...

    对于20考研的学生来说,或许这一段时间比较的焦虑,一方面是初试成绩公布在即,另一方面,复试准备还在摸索中,有很多问题困扰着我们的考研大学生.而在诸多的复试问题中,其中关于应届生和往届生二者之间,是否会 ...

  10. 既生 var 何生 let

    说到 let 和 var 对于前端的同学一定都不陌生,let 是 ES6 提供的一个新的关键字,它和 var 一样都是用来声明变量的,那么你是否想过既生 var 何生 let ?下面就来说一说为什么要 ...

最新文章

  1. C++ link2005 error 错误 解决方法汇总(一般重复定义,如果都是不就是 函数定义和实现没有分离)...
  2. 应用 TransactionScope 报:此操作对该状态的事务无效 的错误
  3. python的image读取的图片是什么类型的-python如何实现读取并显示图片(不需要图形界面)...
  4. Material使用01 侧边栏MdSidenavModule、工具栏MdTollbarModule
  5. 使用ilmerge实现.net程序静态链接
  6. xpcom java_[Mozilla] JavaXPCOM 的jar 包概述
  7. php正则 与 js正则
  8. C++11系列学习之六-----for
  9. vue-day01-vue模板语法
  10. golang 用range 创建指针数组
  11. u盘pe无人值守linux,从U盘无人值守安装linux操作系统(纯实践笔记
  12. 画图必备numpy函数
  13. php创建多级目录函数,php创建多层(多级)目录的函数
  14. python3安装详细教程
  15. ftp工具绿色版,5款ftp工具绿色版好用推荐
  16. U盘启动CDLinux制作方法
  17. 全国计算机竞赛保送清华,竞赛入清华_是不是如果获得全国各学科竞赛的一等奖就能保送清华_淘题吧...
  18. 浅谈UEBA基本实现步骤
  19. 人体自身的神奇补肾法 ——你在外面花多少钱都学不到的
  20. filebeat收集日志到elsticsearch中并使用ingest node的pipeline处理

热门文章

  1. UE4入门序列07(Unreal网络编程之Replication Roles)
  2. Moba项目开发(一)打造网络通信系统-任务3:03.定制通信报文的格式
  3. SQLzoo练习题回顾
  4. ath9K 驱动注册过程
  5. 数据中心机房基础建设,等级、机柜、机架设定等相关内容都在这里!
  6. 最有用的期货技术 — 无招胜有招
  7. question2answer优化
  8. 多益网络2020笔试题
  9. python爬取头条视频_python 爬取头条视频
  10. 【原理/Java并发】从volatile到MESI协议