近期工作中经常使用到WebSocket协议,所以和大家分享一下WebSocket的相关内容,也借此机会整理一下自己的思绪。

HTTP协议(半双工通信)

介绍 WebSocket 前 我们先看看常用的HTTP协议,HTTP是客户端/服务器模式中请求-响应所用的协议,这种模式是半双工通信,浏览器向服务器提交HTTP请求,服务器响应请求的资源。简单说就是浏览器请求,服务器才响应。所以半双工通信的特点就是:

  • 同一时刻数据流是单向的,客户端向服务端请求数据->单向,服务端向客户端返回数据->单向
  • 服务器无法主动推送数据给客户端

这种半双工通信你觉得是否存在局限呢,肯定是有的,因为同一时刻数据是单向的,有时候项目需求是希望服务器能够主动给客户端发送数据,为解决这一问题,在HTML5中又引入了一个双方能够同时通信的API,那就是WebSocket!

WebSocket协议(全双工通信)

WebSocket是  HTML5 开始提供的一种浏览器与服务器进行全双工通讯的协议,属于应用层。它基于TCP传输协议,并复用HTTP的握手通道。

也就是说,建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,其中附加头信息 "Upgrade: WebSocket" 表明这是一个申请将协议升级为WebSocket的 HTTP 请求(具体见图1),服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,此时支持双向数据传输,这是一个长连接,会持续存在直到客户端或者服务器端的某一方主动的关闭连接。

(图1,项目真实抓包)

方法及事件介绍

假设我们创建了一个 ws 对象:

var ws = new WebSocket(url, [protocol] );

参数说明:
    url:指定连接的 URL;
    protocol:可选,指定可接受的子协议。

ws 对象上的事件:

事件 说明
open 连接建立时触发
message 客户端接收到服务端消息时触发
error 通信出现错误时触发
close 连接关闭时触发

另外,我们可以通过 ws.send() 方法,给服务端发送数据;也可以通过 ws.close() 方法主动断开连接。

用例代码

服务端代码

1. 初始化一个node项目

npm init -y

2. 新建一个入口文件 app.js,这里基于koa框架,需要先npm install koa,其他依赖根据提示缺少什么就安装什么,这里不拓展啦。

//app.js
// 使用koa
const koa = require('koa')
const router = require('koa-router')()
// koa-websocket是koa封装好的websocket功能
const websocket = require('koa-websocket')
// 实例化一个ws服务
const app = websocket(new koa())// 监听koa/ws路由,是否有连接
router.all('/koa/ws', (ctx) => {// 监听客户端发送过来的信息ctx.websocket.on('message', function(message) {console.log('收到了客户端发过来的消息:' + message);// 向客户端发送消息ctx.websocket.send('我是服务端')console.log('已向客户端发送数据')});
})
// 使用路由
app.ws.use(router.routes()).use(router.allowedMethods())//端口号后面可采用动态的
app.listen(3000, () =>console.log('服务启动成功')
)

3. 输入命令启动服务

node app.js

客户端代码

1. 新建一个test.html文件

// test.html
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>client</title><script type="text/javascript">function WebSocketTest() {if ("WebSocket" in window){  //判断当前浏览器是否支持websocketalert("您的浏览器支持 WebSocket!");// 打开一个 web socketlet ws = new WebSocket('ws://localhost:3000/koa/ws');// onopen是客户端与服务端建立连接后触发ws.onopen = function(){// 使用 send() 方法发送数据ws.send("我是客户端");console.log('已向服务端发送数据')};//监听服务端发过来的信息ws.onmessage = function (msg) { var received_msg = msg.data;console.log('收到了服务端发过来的信息:'+received_msg)};ws.onclose = function(){ // 关闭 websocketalert("连接已关闭..."); };}else{// 浏览器不支持 WebSocketalert("您的浏览器不支持 WebSocket!");}}</script></head><body><div><button onclick="WebSocketTest()">开启websocket连接</button></div></body>
</html>

2. 浏览器打开 test.html 文件

以上客户端/服务端代码执行效果概括为:点击 “开启websocket连接” 按钮,会触发WebSocketTest方法,即会建立一个websocket连接。

此时客户端的打印是:

服务端的打印是:

由此可见,一个websocket连接已成功建立,双方可以通过send方法自由给对方发送数据。

最后

WebSocket建立的是长连接,且允许服务端主动向客户端推送数据,使得客户端和服务器之间的数据交换变得更加简单。

WebSocket快速入门及基本使用相关推荐

  1. Spring Boot 2 快速教程:WebFlux 快速入门(二)

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘 ...

  2. 编写递归下降语法分析器_Python3知识点流程控制、迭代器、生成器快速入门

    流程控制 if 控制 if 表达式1: 语句if 表达式2: 语句elif 表达式3: 语句else: 语句elif 表达式4: 语句else: 语句 1.每个条件后面要使用冒号 :,表示接下来是满足 ...

  3. SpringBoot约定大于配置的特性解读 SpringBoot快速入门

    SpringBoot约定大于配置 Spring官方网站本身使用Spring框架开发,随着功能以及业务逻辑的日益复杂,应用伴随着大量的XML配置文件以及复杂的Bean依赖关系.随着Spring 3.0的 ...

  4. 快速入门Web前端开发的正确姿势

    入门标准很简单,就一条:达到能参与 Web 前端实际项目的开发水平.请注意,是实际项目,这就需要了解如今的实际项目开发都用了哪些技术栈.HTML/CSS/JavaScript 这三大基础技术栈肯定是需 ...

  5. 开源即时通讯IM框架MobileIMSDK的Uniapp端开发快速入门

    ► 相关链接: ① MobileIMSDK-Uniapp端的详细介绍 ② MobileIMSDK-Uniapp端的开发手册new(* 精编PDF版) 一.理论知识准备 您需要对Uniapp和Vue开发 ...

  6. 芋道 Spring Boot 快速入门

    点击上方"芋道源码",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2019 超神之路,很肝~ 中文详细注释的开源项目 RP ...

  7. 芋道 Spring Boot JPA 入门(一)之快速入门

    点击上方"芋道源码",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2019 超神之路,很肝~ 中文详细注释的开源项目 RP ...

  8. 02-K3S 架构及快速入门

    1 架构介绍 原理就是,将 K8S 的相关组件封装到 K3S 的二进制文件中去,然后启动这二进制文件就可以启动一个成熟的 K8S 集群.我们可以看到 K3S 和 K8S 的架构基本差不多,其中 k3s ...

  9. Spring学习(1)——快速入门

    Spring学习(1)--快速入门 认识 Spring 框架 Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (Inversion of Co ...

最新文章

  1. MCMC+马尔科夫链蒙特卡罗
  2. 如何配置MySQL?(三)
  3. Java 查找指定类型的数组元素
  4. 自研DevOps实践
  5. pycharm 如何搜索?Ctrl+N 搜索py文件 Ctrl+shift+N 搜索所有类型的文件 ctrl+shift+f 全局字符串搜索 ctrl+shift+a 配置项搜索 双shift全局
  6. [转,借鉴]Java学习从入门到精通-过程篇
  7. asp.net MVC提高开发速度(创建项目模板)
  8. android系统(3)---dumpsys 知识学习
  9. java接收jsonarray_java-如何通过JSONArray获取API的数据
  10. 《缠中说禅》炒股经典理论
  11. 显示计算机101代码,steam错误代码-101 解决steam错误代码-101的方法
  12. COOC6.2增加同义词合并无意义词删除等功能
  13. Java Dad08
  14. java apache commons_Apache commons(Java常用工具包)简介
  15. oracle查看当前的数据库实例名称,主机名称
  16. [XUPT]2020寒假训练---比赛专题
  17. 3.4.11nbsp;拉里·埃里森
  18. C语言整理(待更新)
  19. 【深入理解RabbitMQ】RabbitMQ exclusive和mandatory的理解
  20. nginx 学习 --->>> nginx 实现动静分离

热门文章

  1. SpringBoot结合redis解决PV、UV亿级流量
  2. Java实现手机发送短信验证码
  3. zabbix监控配置QQ邮箱服务
  4. 163邮箱苹果设置不成功_【知乎最详细】Windows邮件amp;日历UWP+QQ邮箱如何设置
  5. 软体尚方宝剑(Silver Bullet)何在﹖
  6. 11、函数进阶---装饰器
  7. 金融量化-对数收益率
  8. 全新H3C品牌服务器与存储产品亮相 引领中国IT协同创新之路
  9. 通过javax.mail发送邮件(示例gmail、qq)
  10. BSV斯洛文尼亚商业区块链活动精彩回顾