本文从 WebSocket 基础概念出发,介绍在实际开发中从本地联调到部署上线的流程以及注意事项,让 WebSocket 小白以最小成本应用到项目中。

一、WebSocket 基础

1、什么是 WebSocket

WebSocket 是一种网络传输协议,可在单个 TCP 连接上进行全双工通信

2、对比 http

  • 两者都位于应用层,都依赖TCP协议
  • WebSocket 协议一般以ws://或wss://开头
  • HTTP 不支持全双工通信,一般使用轮询方式

3、WebSocket 基础用法

兼容性:

https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket

一个简单的 Demo

(视频详见原文

客户端可以在控制台 -network-ws下看到 WebSocket 消息

注意请求头里的几个关键字段

  1. 请求地址为 ws:// 或 wss:// 开头
  2. Connection 必须设置 Upgrade,表示客户端希望连接升级
  3. Upgrade字段必须设置 WebSocket,表示希望升级到 WebSocket 协议。
  4. 如果服务端支持 websocket,会在响应头中返回相同的信息,并且连接状态置为101(协议切换成功

二、如何在项目中使用 WebSocke

下面以一个实际项目为例,展示如何实现一个WebSocket接口,包含开发->联调->部署→上线整个流程。

1、开发环境

将上面的 Demo简单封装一下,在项目中调用如下:

配置 webpack 代理

说明:

  • WebSocket接口要和http接口分开
  • 域名使用location.host并且通过反向代理转发,目的是保留cookie和头信息。

2、心跳检测&断线重连

为了保证连接稳定,需要考虑一些异常情况,如网络波动导致连接中断,服务器超时等。

心跳检测即客户端定时向服务端发送心跳消息,保持连接稳定;

断线重连即发送消息前,检测连接状态,若连接中断,尝试n次连接;

封装如下:

也可选择第三方库处理。

3、Nginx配置

The WebSocket protocol is different from the HTTP protocol, but the WebSocket handshake is compatible with HTTP, using the HTTP Upgrade facility to upgrade the connection from HTTP to WebSocket.

This allows WebSocket applications to more easily fit into existing infrastructures.

For example, WebSocket applications can use the standard HTTP ports 80 and 443, thus allowing the use of existing firewall rules.

location /websocket {
proxy_pass http://xx.xxx.xx.xx; # websocket服务器。不用管 ws://
proxy_http_version 1.1; # http协议切换 proxy_set_header Host $host; # 保留源信息
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade; # 请求协议升级,如果生产环境有报400错误,可以尝试将值设置为websocket
proxy_set_header Connection $connection_upgrade;
}

三、其他

sockiet.io

sockiet.io 是基于 Node 的实时应用程序框架,对比原生 WebSocket,封装了更多通用能力,且在不支持WebSocket的浏览器上,可以降级为轮询方式通信。

优点:成熟,开箱即用,兼容性好。

缺点:体积较大,前后端必须统一,即后端使用 socket.io 则前端必须使用 socket.io-client 对应。

作者:vivo 商业化大前端团队

如何在公司项目中使用 WebSocket— 入门实战指南的更多相关文章

  1. 我是如何在公司项目中使用ESLint来提升代码质量的

    ESLint:你认识我吗 ESLint是一个语法规则和代码风格的检查工具. 和学习所有编程语言一样,想要入门ESLint,首先要去它的官网看看:https://eslint.org/. ESLint的 ...

  2. 【C#】MVC项目中搭建WebSocket服务器

    前言 因为项目需要,前端页面中需要不断向后台请求获取一个及一个以上的状态值.最初的方案是为每个状态值请求都建立一个定时器循环定时发起Ajax请求,结果显而 易见.在HTTP1.1协议中,同一客户端浏览 ...

  3. SSH 项目中 使用websocket 实现网页聊天功能

    参考文章  :java使用websocket,并且获取HttpSession,源码分析    http://www.cnblogs.com/zhuxiaojie/p/6238826.html 1.在项 ...

  4. JQuery复制内容到剪切板-jquery.zclip.js的使用,在公司项目中

    公司项目中有一个复制粘贴的内容,也试图找其他插件但都是浏览器兼容问题,在网上找这个插件挺不错的,FLASH,兼容各个浏览器,测试时要在服务器环境下,点击参考,参考这个网址,或者搜下标题这个插件,性能不 ...

  5. DevOps 在公司项目中的实践落地

    原文出处:https://www.cnblogs.com/beef/p/7743594.html ref: [DevOps]团队敏捷开发系列--开山篇 https://www.cnblogs.com/ ...

  6. 结合manage.py,在flask项目中使用websocket模块--- flask-socketio

    前言:       - 为什么我要使用 flask-socketio模块,而不是flask-sockets?       - 因为flask-socketio与前端流行的websocket库socke ...

  7. SpringBoot项目中,WebSocket的使用(观察者设计模式)

    1.什么是WebSocket(选择至菜鸟教程(点击跳转),观察者模式) WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和 ...

  8. Springboot 项目中引入WebSocket后,单元测试出现错误

    报错信息 java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test. ...

  9. Vue项目中使用websocket

    <template> <div class="test"> </div> </template> <script> ex ...

  10. logstash快速入门实战指南-Logstash简介

    作者其他ELK快速入门系列文章 Elasticsearch从入门到精通 Kibana从入门到精通 Logstash是一个具有实时流水线功能的开源数据收集引擎.Logstash可以动态统一来自不同来源的 ...

随机推荐

  1. 一个基于ASP.NET Core完全开源的CMS 解决方案

    本文简介 MixCoreCMS是一个基于.NET Core框架的开源内容管理系统(CMS),提供了丰富的的基础功能和插件,是一款面向未来的企业 Web CMS,可轻松构建任何类型的应用程序.集成了Go ...

  2. 深入浅出 PLT/GOT Hook与原理实践

    动态链接 计算机程序链接时分两种形式:静态链接和动态链接. 静态链接在链接时将所有目标文件中的代码.数据等Section都组装到可执行文件当中,并将代码中使用到的外部符号(函数.变量)都进行了重定位. ...

  3. Linux笔记01: Linux简介

    1.1 操作系统 计算机系统是由硬件子系统(处理器.内存.硬盘.键盘.鼠标.显示屏等)和软件子系统(如Windows操作系统.Office办公软件等)组成. 操作系统(Operating System ...

  4. [CF1599A] Weights

    题目描述 You are given an array $ A $ of length $ N $ weights of masses $ A_1 $ , $ A_2 $ ... $ A_N $ . ...

  5. 【matlab混沌理论】1.3.双摆杆基本模型

    双摆杆是混沌理论的典型运动模型之一.涉及重力加速度.摆杆长度和质量. 1.双摆杆的摆角分析 input: % 已知物理参数 L1 = 5;L2 = 3; %两摆杆长度和质量 m1 = 3;m2 = 5 ...

  6. Google Guava提供的特殊的Table集合

    1.Table 是个啥? 是一个特殊的映射,其中两个键可以在组合的方式被指定为单个值.它类似于创建映射的映射. 当你想使用多个键做索引的时候,你可能会用类似 Map<rowKey, Map< ...

  7. 深入理解 Docker 核心原理:Namespace、Cgroups 和 Rootfs

    通过这篇文章你可以了解到 Docker 容器的核心实现原理,包括 Namespace.Cgroups.Rootfs 等三个核心功能. 如果你对云原生技术充满好奇,想要深入了解更多相关的文章和资讯,欢迎 ...

  8. python tkinter 使用(七)

    python tkinter 使用(七) 本篇文章主要讲下tkinter 中的message 控件. Message控件可以用于在窗口中显示一段文本消息. 以下是个简单的例子: #!/usr/bin/ ...

  9. 本地tomcat设置外网访问

    将host name中的localhost修改为自己电脑的IP地址,具体的IP地址可以在控制面板的网络和共享中心中进行查看, 打开tomcat的conf文件夹下的server.xml文件,将local ...

  10. URL安全的Base64算法

    URL安全的Base64算法 base64是取3个字节(24位)的数据强行组成4个字节(32位)的数据做为一个分组,24位分成4个字节的话,每个字节分到6位,然后前面补两位0,然后这个字节的值位索引去 ...