本文作者:IMWeb went

未经同意,禁止转载

1.使用websocket 场景

websocket作为用于双向通信的实用协议,在笔者最近做的全平台私信系统进行了应用。本次开发的私信系统与普遍理解的“发送-接受-发送”三个流程分开不一样,实现的是类似于QQ与微信的实时通信系统,需要做到收发消息实时化。

进行通信协议选定的时候,不能由服务器主动联系客户端,又因为每次通信都需要经过握手请求、响应步骤进行连接重建的http协议只能通过轮询进行伪双向通信,所以http协议首先被我们排除了,在HTML5下的协议websocket映入了我们的眼帘。

2.websocket 机制

首先要明确的一点是,支持websocket协议的客户端和服务器能够使用websocket协议进行双向通信,也就是客户端可以随时向服务器发送请求,服务器也能够随时向客户端发送请求。

跟http使用轮询实现不一样的是websocket一次连接成功后则可以重复进行请求和响应,更好地节省了服务器的资源与带宽。

websocket与http协议类似的是同样建立于tcp传输协议之上,通过tcp传输层进行数据传输。而客户端与服务器端一般使用的通信协议仍是http,我们要使用websocket协议进行通信则首先要建立起websocket连接,这个连接的建立依赖于http。

一个websocket连接首先发送http请求到服务器,注意比起平常的http请求多了4个字段,sec-WebSocket-* 为建立websocket协议的参数,upgrade字段才是重点,告诉服务器我这次的请求不是单纯的http请求,而是要求服务器升级连接并建立起websocket长连接。

服务器响应也根据特殊的请求头进行了特殊响应,首先101返回码表明本次连接的通信协议经过了转换并成功握手成功建立起了通信。connection字段和upgrade字段则表明本次通信协议进行了升级转换,转换的是websocket协议。

websocket的协议标识符为ws,从下图Request URL看到本次websocket连接的协议标识符为wws,这表示websocket连接是经过加密处理的。

建立了websocket连接后,只要客户端和服务器端任意一端不主动断开连接前,通信行为都是在一个持久连接上发起,后续数据与请求都通过帧序列的形式进行传输。

从chrome控制台的Websocket调试面板中可以看到,在一个websocket连接中多次请求都可以由服务器进行实时响应,实行实时上下行通信的能力得以见证。

3.websocket API

通过WebSocket构造函数可以创建websocket连接并返回提供管理该连接API的实例对象。

const ws = new WebSocket('wws://url');

websocket 属性与事件

事件&属性

定义

onopen

服务器端响应连接请求后,readyState状态置为OPEN时触发。标志着握手阶段已结束,可以进行收发消息。

onmessage

服务器端有消息到达时触发,可以接受文本和二进制数据。

onclose

连接关闭时,readyState状态置为CLOSED时触发。标志着服务器端与客户端不能再通信。

onerror

错误发生时触发,会导致连接关闭。

readyState

websocket连接状态。CONNECTING(连接中) OPEN(连接成功) CLOSING(关闭中) CLOSED(已关闭)

protocol

websocket连接协议。ws & wws

bufferedAmount

调用send方法后在发送队列缓存中的数据量,所有消息已发出则清零。

binaryType

当收到二进制数据时,用于表示该二进制数据的类型(blob & arraybuffer)

// 监听到open事件后,向服务器发送success文本。

ws.addEventListener('open', (e) => {

ws.send('success!');

})

websocket 方法

(1) send 方法

// 文本数据

const text = 'i am text';

// 二进制数据

const blob = new Blob('i am blob');

ws.send(text);

ws.send(blob);

(2) close 方法

close方法可以传入两个参数 code 和 reason ,用于向服务器端说明关闭连接原因。

ws.close(1000, 'mission finished');

// 不传任何参数,默认code是1000,表示正常关闭

ws.close();

4. 小结

在需要实现双向实时通信的场景下,不妨直接使用websocket协议吧。但是目前IE8和IE9是不支持websocket的,要实现该功能还是只能通过http 的long polling 方式去实现。

以上是websocket的基础理论,希望了解后有助于大家的实践!

websocket网络层详解_websocket 协议解析相关推荐

  1. websocket java详解_WebSocket详解

    WebSocket详解 WebSocket可提供一个在 单一TCP连接全双工双向通信协议.全双工意味着客户端和服务器可以独立发送信息给 对方.双向意味着客户端可以向服务器发送信息, 反之亦然. Web ...

  2. websocket网络层详解_【技术分享】WebSocket漏洞与防护详解

    2017-05-02 14:15:48 阅读:1889次 预估稿费:120RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 socket简介 一个socket是一次网络通信 ...

  3. 一篇文章带你详解 HTTP 协议

    一篇文章带你详解 HTTP 协议 本篇文章篇幅比较长,先来个思维导图预览一下. 一张图带你看完本篇文章 一.概述 1.计算机网络体系结构分层 计算机网络体系结构分层 2.TCP/IP 通信传输流 利用 ...

  4. 简书大佬的笔记:一篇文章带你详解 HTTP 协议(网络协议篇一)

    一篇文章带你详解 HTTP 协议(网络协议篇一) 本篇文章篇幅比较长,先来个思维导图预览一下. 一张图带你看完本篇文章 一.概述 1.计算机网络体系结构分层 计算机网络体系结构分层 2.TCP/IP ...

  5. 一篇文章带你详解 HTTP 协议(下)

    文章目录,方便阅读: 一.概述(已讲) 二.HTTP 工作过程(已讲) 三.HTTP 协议基础(已讲) 四.HTTP 协议报文结构(已讲) 五.HTTP 报文首部之请求行.状态行(已讲) 六.HTTP ...

  6. 通过CURL请求示例详解HTTPS协议

    通过CURL请求示例详解HTTPS协议 基于HTTPS通信是当前互联网最通用便捷的通信方式,简单理解来看可以视为HTTP协议 + SSL/TLS协议,通过一个curl的示例阐述一下HTTPS协议. 特 ...

  7. webSocket(与http请求区别、请求和返回示例、替代方法:ajax轮询、long poll、Flash、NodeJS实现WebSocket通信代码、原理、WebSocket构造函数详解)

    目录 简介 优点 请求示例 请求成功返回示例 替代方法 Ajax 轮询 long poll Flash NodeJS实现webSocket(ws模块) 服务端代码 客户端代码 在线网页客户端 运行结果 ...

  8. Spring和WebSocket整合详解

    Spring和WebSocket整合详解 本篇编写日期较早,代码冗余较多,新博文:Spring和WebSocket整合并建立简单的Web聊天室 官方主页 Spring WebSocket 概述 Web ...

  9. java技术详解_Java反射技术详解及实例解析

    前言 相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解APT替 ...

最新文章

  1. iphone开发如何测试?
  2. 华北水利水电大学计算机研究生调剂,2018年华北水利水电大学硕士研究生相关专业接受调剂公告...
  3. 在.NET Core中使用MongoDB明细教程(3):Skip, Sort, Limit, Projections
  4. 程序员求助:被领导强行要求写Bug该怎么办?网友的回答让我笑翻
  5. 区间内的真素数(信息学奥赛一本通-T1411)
  6. Redis:使用Redis的分布式锁
  7. python数据格式简介_Python中数据类型时间的介绍(附代码)
  8. pythonfor循环语句例子_简单的python循环知识
  9. 文本文件与二进制文件
  10. 【js类库AngularJs】解决angular+springmvc的post提交问题
  11. Rect 的相关操作
  12. 有多大的大脑互联网正在开发社交网络
  13. nginx 正向代理_看这篇彻底认识Nginx!
  14. 鸿蒙系统pc版测评,华为MatePad Pro测评:鸿蒙系统+麒麟9000,旗舰平板封神之作?...
  15. UNIX再学习 -- ps、top、kill 指令
  16. 电商后台设计:权限设计
  17. 数据结构(C语言版)之栈及递归
  18. 一个简简单单的许愿墙
  19. Word 自动更改题注章节编号格式“图一.1”为“图1.1”
  20. php preg_match 漏洞,PHP preg_match()函数信息泄露漏洞

热门文章

  1. 【单例模式】—— 每天一点小知识
  2. Java生成二维码的几种实现方式(基于Spring Boot)
  3. 蓝桥ROS机器人之曾经新版本(indigo/kinetic/melodic/ardent/dashing)
  4. 事情很严重,卡巴斯基很生气
  5. 创建角色、ansible-galaxy简单使用
  6. 工作中整理的常用的Linux命令
  7. MIGO创新挖矿,玩游戏也可以有收益
  8. 漫谈电子游戏中的人工智能
  9. 计算机组成原理学习通第七章课后作业
  10. 泰山OFFICE技术讲座:给中文设置英文字体,会怎样