本文从 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. C/C++ Zlib库封装MyZip压缩类

    Zlib是一个开源的数据压缩库,提供了一种通用的数据压缩和解压缩算法.它最初由Jean-Loup Gailly和Mark Adler开发,旨在成为一个高效.轻量级的压缩库,其被广泛应用于许多领域,包括 ...

  2. 2分钟,快速认识什么是SQL

    结构化查询语言,简称SQL,它是与关系数据库管理系统通信的黄金标准语言.今天就来一起快速认识一下什么是SQL,您可以通过以下的文字内容学习,也可以通过文末的视频学习,希望本文对您有所帮助. 您可能听说 ...

  3. uniapp---wap2app去掉系统自带的导航栏

    在用uniapp进行将wap站转化为app的时候,默认打包后的文件,带有系统的导航栏,下面是去除的办法: 第一步:找到 sitemap.json 设置 titleNView为false:  第二步:在 ...

  4. jdk9模块化

    JDK 9是Java开发语言的一个重大版本.其中最令人兴奋的新特性之一是模块化系统.模块化系统提出了一种新的代码组织方式,它可以帮助开发人员更好地组织和管理代码,从而使Java应用程序更加可维护.可扩 ...

  5. ClickHouse(17)ClickHouse集成JDBC表引擎详细解析

    目录 JDBC 建表 用法示例 JDBC表函数 资料分享 参考文章 JDBC 允许CH通过JDBC连接到外部数据库. 要实现JDBC连接,CH需要使用以后台进程运行的程序 clickhouse-jdb ...

  6. Lucas定理 、斯特灵公式

    斯特灵公式是一条用来取n阶乘的近似值的数学公式. 公式为: 用该公式我们可以用来估算n阶乘的值:估算n阶乘的在任意进制下的位数. 如何计算在R进制下的位数:我们可以结合对数来计算,比如十进制就是lg( ...

  7. java之switch用法

    多条件判断,判断条件是等值判断时,可以用switch 比如: 变量level=0时,输出"非会员" 变量level=1时,输出"打9折" 变量level=2时, ...

  8. MyBatis高频面试题

    1.MyBatis中使用#和$书写占位符有什么区别? 2.Hibernate 与 Mybatis区别(MyBatis与Hibernate有什么不同). 3.持久层设计要考虑的问题有哪些? 4.你用过的 ...

  9. MinIO客户端之mb

    MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc mb MinIO对象锁定 桶版本控制 桶复制 站点复制概述 创建桶bkt1,命令如下: ./mc mb lo ...

  10. Linux的期末冲刺

    选择 一.Linux基础 Linux目录结构 相关命令: cd, ls, pwd 详解: Linux 目录结构采用树状结构,根目录为 /.用户的帐户信息保存在 /etc/passwd 文件中,包括用户 ...