强烈推荐

2023-10-27

一. 前言

在开发中,我们经常会遇到这样一类需求:需要在网页上显示天气预报,股票数据或者实时排行榜单等实时变化的数据。对于此类需求,一种较为原始的做法就是客户端每隔一段时间主动轮询服务器但这种做法有一个很大的弊端:如果客户端的数量很大,每隔一段时间就发消息给服务器的话,服务器的并发压力会非常巨大。而且访问的频度也很难精确把握,过于频繁地访问服务器,则压力太大;不频繁的话,数据更新可能又不及时。

所以今天,耀哥将会给大家分享一个可以让服务器主动推送消息给客户端的技术--websocket

二. WebSocket介绍

2.1 概念

以下是百度百科对websocket的定义:

WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。

WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

2.2 WebSocket运行流程

  • 首先,客户端发起http请求,经过3次握手后,建立起TCP连接。http请求里存放WebSocket支持的版本号等信息,如Upgrade、Connection、WebSocket-Version等;

  • 然后,服务器收到客户端的握手请求后,同样采用HTTP协议回馈数据;

  • 最后,客户端收到连接成功的消息后,开始借助于TCP传输信道进行全双工通信。

2.3 Tomcat对WebSocket的支持

Tomcat7.0.5开始支持WebSocoket。客户端通过WebSocket协议和服务器端握手,就会创建EndPoint实例。EndPoint实例在客户端与服务器链接过程中有效,最后在链接关闭时结束。在Endpoint接口中明确定义了与其生命周期相关的方法,规范实现者确保生命周期的各个阶段调用实例的相关方法。生命周期方法如下:

方法 含义描述 注解

onOpen

当开启一个新的会话时调用,该方法是客户端与服务器端握手成功后调用的方法

@OnOpen

onClose

当会话关闭时调用

@onClose

onError

当连接过程中异常时调用

@OnError

三. WebSocket基本使用

3.1 浏览器和服务器建立起连接

在浏览器中使用WebSocket进行连接,代码如下:

// WebSocket HTML5提供的内置对象
var ws = new WebSocket("ws://localhost:8080/chatroom_war_exploded/wstest");
ws.onopen=function(){
    alert("连接服务器成功")
}

在后端创建Endpoint类,代码如下:

@ServerEndpoint("/wstest")
public class WsTest {
    @OnOpen
    public void onOpen(Session session, EndpointConfig endpointConfig) {
        System.out.println("有客户端连接了");
    }
}

3.2 浏览器发送消息给服务器

浏览器通过send方法给服务器端发送消息,代码如下:

function send(){
    //发送消息
    var msg = document.getElementById("msg");
    ws.send(msg.value);
    msg.value = ""
}

服务器端通过onMessage接收请求消息,代码如下:

@OnMessage
public void onMessage(String message,Session session){
    System.out.println("来自客户端的消息:"+message);
}

3.3 服务器端推送消息给浏览器

在服务器端推送消息,代码如下:

@OnMessage
public void onMessage(String message,Session session){
    System.out.println("来自客户端的消息:"+message);
    //返回消息给客户端
    try {
        // session 就是客户端和服务器自连接起来建立的会话
        // 直到关闭连接直接这个会话一直是连接的,所以我们在这个过程中可以用它给客户端推送消息
        session.getBasicRemote().sendText("收到你的消息了");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在浏览器中通过onmessage接收接收消息,代码如下:

ws.onmessage=function(res){
    console.log("来自服务器的消息:"+res.data)
}

3.4 关闭连接

服务器端关闭,代码如下:

session.close();

客户端关闭,代码如下:

ws.close();

服务器端对关闭的响应,代码如下:

@OnClose
public void onClose(Session session){
    System.out.println("连接已经关闭了,");
}

客户端对关闭的响应,代码如下:

ws.onclose=function(){
    console.log("连接已经关闭")
}

3.5 异常处理

服务器端异常处理,代码如下:

@OnError
public void onError(Throwable t) throws Throwable {
    System.out.println("系统异常!msg:" + t);
}

浏览器端异常处理,代码如下:

ws.onclose=function(){
    console.log("连接已经关闭")
}

四. 总结

耀哥认为,websocket协议就是对http协议不能主动接受服务器推送消息的一种补充。以下是耀哥给大家总结出的http协议和websocket协议之间的区别:

  • WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息

  • HTTP是单向的

  • WebSocket是需要浏览器和服务器握手进行建立连接的

  • http是浏览器发起向服务器的连接,服务器预先并不知道这个连接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

强烈推荐 的相关文章

随机推荐

  • spring源码--09--IOC高级特性--BeanPostProcessor后置处理器的实现

    spring源码 09 IOC高级特性 BeanPostProcessor后置处理器的实现 1 BeanPostProcessor 后置处理器是一个监听器 可以监听容器触发的Bean声明周期事件 后置处理器向容器注册以后 容器中管理的Bea
  • Linux THREAD 线程技术

    NPTL Nativ Posix Thread Library 1 几种线程类型 用户级线程 1 用户级线程无法被系统识别为调度单位 所以不会分发跟多的CPU使用资源 时间片 2 用户级线程无需系统干预 因定义与使用全部在用户层完成 上下文
  • Vue脚手架(vue-cli)搭建和目录结构详解

    一 环境搭建 1 安装node npm webpack 不多说 2 安装vue cli脚手架构建工具 打开命令行工具输入 npm install vue cli g 安装完成之后输入 vue V 注意这里是大写的 V 如果出现相应的版本号
  • 布隆过滤器(Bloom Filter)

    TOC 布隆过滤器 Bloom Filter 1 什么是布隆过滤器 1 布隆过滤器的简单介绍 布隆过滤器 Bloom Filter 是1970年由布隆提出的 它实际上是一个很长的二进制向量和一系列随机映射函数 布隆过滤器可以用于检索一个元素
  • 该重视软件方法了,实现:利润 = 需求 - 设计

    本文篇幅有些长 但是相比阅读各类书籍 然后理解和吸收 会大大节省很多时间 对于一些书中难以理解的部分做了改进 帮助更好的理解 可能阅读本文需要一些软件方法的基础知识 才能更好理解和吸收 甚至提出反馈建议 希望文本对大家有帮助 当然这需要运用
  • vue3组合式api <script setup> props 父子组件的写法

    父组件传入子组个的变量 子组件是无法直接修改的 只能通过 emit的方式 让父组件修改 之后子组件更新
  • 入门机器学习(西瓜书+南瓜书)线性回归和逻辑回归总结(python代码实现)

    入门机器学习 西瓜书 南瓜书 线性回归和逻辑回归总结 python代码实现 一 线性回归理论总结 1 1 通俗理解 通俗理解的线性回归就是求解方程 拿一个最简单的例子来说就是对 y k x b y k
  • scipy提示GLIBCXX缺失,‘GLIBCXX_3.4.29‘ not found (required by xxx)

    credit https askubuntu com q 1393285 https askubuntu com a 1422639 使用ubuntu的test toolchain发布源 sudo add apt repository pp
  • SpringBoot 集成 Swagger 3.0 和 knife4j 文档教程

    SpringBoot 项目集成 Swagger 3 0 文档 添加依赖 在 SpringBoot 项目中 在 pom 文件中添加 Swagger 3 0 的依赖
  • Node.js中的回调函数详解

    Node js中的回调函数详解 回调函数概述 回调函数定义 回调函数主要用途 回调函数用法 回调函数基本格式 简单的回调函数实例 执行顺序理解 回调函数实例 回调函数概述 回调函数在很多地方都有用到 本文主要介绍Node js的回调函数 主
  • spring:集成JDBC

    spring作为一站式框架 提供了控制层的 SpringMVC 和 持久层的 Spring JdbcTemplate 1 导入相关的jar包 pom xml mysql
  • tomcat 和 jboss的热部署(热发布)问题

    所谓的热部署 热发布 下面称为 热部署 就是说 在web工程发布之后 不可避免的 会遇到修改BUG的问题 现在的热部署就是为了解决这个问题 其功能就是说 在不停止web服务的同时 对jsp和java类进行修改 修改后的效果同时还能够在页面上
  • 改变python默认版本方法

    通过软链接命令 ln 此方法为系统级修改 先删除默认的Python软链接 sudo rm rf usr bin python 然后创建一个新的软链接指向需要的Python版本 sudo ln s usr bin python3 usr bi
  • 在idea中启动Vue项目报错Love-Swiper

    今天在重新配置idea时出现的这个错误 由于已经修改完毕 无法重现 大概报错为 Love Swiper 主要错误原因时没有安装vue的这个组件 使用以前语句即可 npm i vue awesome swiper save ignore sc
  • linux中python操作redis读取数据写入文件

    编写python脚本 扫描redis中终端在线集合和查询终端状态表 在redis中 终端在线集合是有序集合存储方式 成员是终端状态表名 终端状态表以hash方式存储 是一个string类型的field和value的映射表 1 脚本第一行是指
  • 常见伪代码指令及使用

    1 声明statement 1 1 Assignment statement赋值语句 variable expression e g将表达式3 4赋给变量result result 3 4 1 2 compound statements 复
  • 2维正态分布-矩阵表示-推导过程

  • 国内主流在用的10大后台UI框架,私活必备

    目录 vue Element Admin AdminLTE ant design pro tabler ng2 admin Gentelella iview admin blur admin vue admin material dashb
  • 今夜你会不会想起我

    夜渐渐的深了 疲惫了一天 还是觉得想写点什么 于是跳下床 把目光所及之处整理了一下 坐下来打开电脑 蓝光从电脑开关处不断的跳跃 随着windows熟悉的声音响起 输入密码 进入桌面 没有登录QQ 只是点开音乐播放器 单曲循环着一首老歌 一首
  • 强烈推荐

    一 前言 在开发中 我们经常会遇到这样一类需求 需要在网页上显示天气预报 股票数据或者实时排行榜单等实时变化的数据 对于此类需求 一种较为原始的做法就是让客户端每隔一段时间主动去轮询服务器 但这种做法有一个很大的弊端 如果客户端的数量很大