WebSocket

WebSocket是一种在浏览器和服务器之间建立全双工通信通道的协议,解决了HTTP协议服务器无法主动向浏览器推送信息的问题。通过Java注解可以便捷地实现WebSocket服务器端,包括连接打开、关闭、消息监听等功能,并且Spring框架提供了进一步的封装支持。此外,WebSocket基于TCP,没有同源限制,适合实时通信需求。
摘要由CSDN通过智能技术生成

一. WebSocket概述

  • 在后端服务器与服务器之间,HTTP请求是可以相互发送的,但是在浏览器与服务器之间,HTTP请求只能从浏览器发起,方向固定,不能从服务器往浏览器主动去发起HTTP请求。

问题:服务器无法直接向浏览器发送请求(HTTP协议的缺陷)

常见替代方案:轮询,浏览器给服务器不断地发送请求询问支付结果。

轮询缺陷:

  • 浪费带宽(因为浏览器会不断地给服务器发送请求)
  • 实时性差(并不是服务器知道结果以后,浏览器那边就能立刻知道,要等到浏览器下一次去询问的时候才能知道结果)
  • 服务器压力大(特别是像促销之类的活动,服务器会收到大量的询问订单结果的请求)

1.1 WebSocket协议

  • 2008年提出,2011年成为标准
  • 最早是HTML5新增的协议,现在基本所有的语言都支持
  • 作用:可以在浏览器和服务器之间建立一个全双工的通信通道(就是浏览器既可以往服务器发请求,服务器也可以往浏览器发请求,这就叫一个全双工的通信协议)

1.2 WebSocket实现浏览器与服务器的通信流程 / 过程

 1. 浏览器发起HTTP请求,请求建立WebSocket连接

  • 在浏览器发起的HTTP请求当中,URL是以ws:开头的,而不是之前见到的http或者https开头的。ws是WebSocket的缩写。

 2. 服务器响应同意协议更改

  • 服务器响应同意协议更改,会响应一个101的状态码,切换协议的意思

3.  相互发送数据

  • 绿色箭头代表的是浏览器向服务器发送的消息,红色箭头代表的是服务器向浏览器发送的消息

 

1.3 WebSocket底层原理 

  • WebSocket协议建立在TCP协议基础上的,所以服务器端也容易实现,不同的语言都有支持
  • TCP协议是全双工协议,HTTP协议基于它,但设计成了单向的
  • WebSocket协议是对HTTP协议的一个补充,某一些HTTP做不到的场景WebSocket来补充它
  • WebSocket没有同源限制(同一个IP,同一个端口叫同源,就是浏览器端的地址和服务器端的地址它的IP端口是一致的,这就叫同源)
  • 什么是不同源,就是IP端口不一致的。
  • 现在前后端分离项目经常就是不同源的,前端会起一个端口比如8081,后端会起一个端口比如9091,此时前端去访问后端就会存在这个不同源的一个限制,就是会存在一个跨域异常。
  • 可以通过前端配代理去解决或者上到服务器上可以通过Nginx反向代理去解决这个跨域问题。
  • 因为WebSocket没有同源限制,所以即使你的前端的源和后端的源不一致,也不影响WebSocket请求的发送。

二. Java实现WebSocket的两种方式

使用Spring封装

在Spring里面已经帮我们实现了WebSocket的基本功能,它完成了HTTP协议升级为WebSocket协议的这个过程,封装了通信,以及完成了很多的通信细节的功能。

我们并不是要去实现WebSocket这个功能的后端开发,我们要做的就是在Spring给我们提供的实现了WebSocket功能的基础之上去完成一些业务功能的开发,这些业务的功能可以有两种方式来实现:

  • 一种是比较简单的,基于Java注解的方式
  • 另一种是基于Spring提供的上层封装,它有很多应用级别的封装,我们用它去开发的话,会比较的快捷和方便。

 3.1 基于Java注解实现WebSocket服务器端

 

LomBok依赖可以让我们更方便的去打印日志,同时它还提供一些注解可以快速的给实体类生成Getter、Setter方法。

package com.gch.java;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


/**
   监听WebSocket客户端地址/myWs谁来连接了WebSocket服务端
 */
@ServerEndpoint("/myWs")
@Component // 声明为一个Bean
@Slf4j
public class WsServerEndpoint {
    // 有多个客户端来连接,应该使用线程安全的CurrentHashMap
    public static Map<String,Session> sessionMap = new ConcurrentHashMap<>();
    // 当WebSocket客户端连接WebSocket服务端的时候,我们需要来声明一下我们的服务端去做哪些事情
    // 连接建立时执行的操作
    @OnOpen
    // 每一个WebSocket连接对于服务端来说都是一个session
    public void onOpen(Session session){
       sessionMap.put(session.getId(),session);
       log.info("websocket is open");
    }
    // 监听通信
    // 当WebSocket客户端浏览器给WebSocket服务器发消息的时候,我服务器做什么事情
    // 收到了客户端消息执行的操作
    @OnMessage
    public String onMessage(String text){
        log.info("收到了一条信息:" + text);
        return "已收到你的消息";
    }
    // 监听到连接关闭时执行的操作
    @OnClose
    public void onClose(Session session){
        sessionMap.remove(session.getId(),session);
        log.info("websocket is close");
    }

    // 每隔多少毫秒去执行一次定时任务给客户端发送xx
    @Scheduled(fixedRate = 2000)
    public void sendMsg() throws IOException {
        for(String key: sessionMap.keySet()){
            sessionMap.get(key).getBasicRemote().sendText("心跳");
        }
    }

    // 现在,Spring框架并不能扫描到我们的服务终端,我们还需要再加一个配置类
    // HTTP加上S之后它是一个更安全的传输
}
package com.gch.java;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * 配置类
 * 注入Spring WebSocket框架里的一个对象叫做ServerEndpointExporter
 */
@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }
}
package com.gch;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableScheduling // 开启定时任务
@SpringBootApplication
public class WebsocketQuickstartApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebsocketQuickstartApplication.class, args);
    }

}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ws client</title>
</head>
<body>
</body>

<script>
    let ws = new WebSocket("ws://localhost:8080/myWs")
    ws.onopen = function (){
        ws.send("hello")
    }
    ws.onmessage = function (message) {
        console.log(message.data)
    }
</script>
</html>

 3.3   基于Spring框架实现WebSocket服务器端

Spring框架已经在应用层面去帮我们定义了一些接口和抽象类,我们只要实现这些接口和抽象类,就能够完成一个目录比较清晰的WebSocket的服务器端,并且它里面有很多封装的功能我们可以直接使用。

 

 

 

 

 

 

GaoSSR
关注 关注
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
结合融云 WebSDK 了解 WebSocket 基本原理
wf10w的博客
12-29 580
结合融云 WebSDK 了解 WebSocket 基本原理 近期使用融云开发聊天页面, 通过抓包, 发现融云 SDK 使用 WebSocket 实现与服务端通讯, 因此简单了解 WebSocket 的实现原理 融云 SDK 文档: https://docs.rongcloud.cn/v4/ WebSocket 与 HTTP 1、HTTP 协议没有为了 WebSocket 的出现改变 2、WebSocket 属于 HTTP 之后的新协议 3、两者有交集, 也各有不同 4、WebSocket 借用 HTTP 协
若依WebSocket集成
04-01
WebSocket是一种在客户端和服务器之间建立长连接的协议,它允许双方进行全双工通信,即数据可以在两个方向上同时传输,极大地提高了实时性。在若依框架中集成WebSocket,可以为用户带来更流畅、即时的交互体验,尤其...
实时通信的 WebSocket 替代方案
m0_73443478的博客
03-07 2752
实时通信的 WebSocket 替代方案
SSE(Server-Sent Events):替代websocket完成服务器推送
feiyangtianyao的专栏
12-09 1938
SSE(Server-Sent Events):替代websocket完成服务器推送 一、概述 提到服务端数据推送,你可以一下子就想到了WebsocketWebSocket是一种全新的协议,随着HTML5草案的不断完善,越来越多的现代浏览器开始全面支持WebSocket技术了,它将TCP的Socket(套接字)应用在了webpage上,从而使通信双方建立起一个保持在活动状态连接通道。 但你可能不知道,HTML5中有一个轻量的替代Websocket的方案:SSE(Server-Sent Events)。 W
浏览器websocket
weixin_34221073的博客
04-15 112
使用浏览器,PHP 来构建的应用,发现都是每次浏览器发送一次http 请求,PHP 回一个响应。 这样,后端的PHP 在处理多次http请求是,每次都是不同的进程在处理。 这就加大了开销, 而且,PHP 在处理多次的http请求时,前后多个PHP进程之间的感觉都没啥联系, 这些前后PHP进程之间怎么才能共享一些资源呢?比如,和第三方的tcp连接, 数据库连接, modbus tcp 的连接 能保持...
替代Websocket的解决方案:GoEasy
程序萌部落
11-11 1368
写在前面GoEasy这个库的适用场景:同Websocket的场景在后台使用例如Java进行逻辑处理后将变量的值传入前台,前台不用发起请求即可接收后台发布的数据,整个流程与Redis的Pub和Sub过程类似整个交互类似Socket的长连接,前台首次调用不需要请求后台。非常适合监控后台参数等场景; 但是:GoEasy最大的问题:传输数据大小有限制,大概...
websocket c语言实现
10-07
WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许双方进行全双工通信,即数据可以在两个方向上同时传输,极大地提高了实时性。在Web开发中,WebSocket为需要实时交互的应用提供了强大的支持,比如...
websocket-server
08-29
WebSocket服务器是一种允许服务端与客户端进行实时双向通信的技术。在传统的HTTP协议中,服务器只能被动响应客户端的请求,而WebSocket则打破了这一限制,使得服务器能够主动推送数据到客户端,极大地提高了实时性...
简单实现了websocket功能:websocket客户端、winformsocket客户端
10-08
WebSocket是一种在客户端与服务器之间建立持久连接的协议,它允许双方进行全双工通信,即数据可以在两个方向上同时传输,极大地提高了实时性。在本项目中,"简单实现了websocket功能:websocket客户端、winform...
Windows系统下,websocket桌面工具
10-28
WebSocket是一种在Web应用程序中实现全双工通信的协议,它允许服务器和客户端之间进行实时、双向的数据交换。在Windows系统下,开发人员经常会使用专门的WebSocket桌面工具来辅助项目的调试和测试工作。本文将详细...
替代Websocket的解决方案:GoEasy.docx
10-26
替代Websocket的解决方案:GoEasy.docx
discord-no-cache:替代性的WebSocket和使用Restord客户端的小巧宁静,因此(内部)不涉及缓存
05-22
不和谐的缓存 替代性的WebSocket以及使用不和谐客户端的小巧宁静,因此(内部)不涉及任何缓存。 用于根本不需要缓存的简单库的内部使用。
http协议建立在以下哪一个协议的基础上_计算机网络 基于 HTTP 的功能追加协议...
weixin_39574388的博客
11-26 244
本文记录了阅读《图解HTTP》的《基于 HTTP 的功能追加协议》章节的笔记。一、基于 HTTP 的协议在建立 HTTP 标准规范时,制订者主要想把 HTTP 当作传输 HTML 文档的协议。随着时代的发展,Web 的用途更具多样性,比如演化成在线购物网站、SNS(Social Networking Service,社交网络服务)、企业或组织内部的各种管理工具,等等。而这些网站所追求的功能可通过 ...
websocket替代方案_为什么我要用GoEasy替代WebSocket
weixin_39928099的博客
12-31 1082
最近一个紧急项目里,出于考虑节约开发成本和缩短开发周期的目的,我选择用GoEasy来替代自己搭建WebSocket,当然我也考虑过workerman和融云等同类型的产品。最后选择GoEasy的原因只有2点,极简、稳定。我可以来说一下我在项目里从GoEasy得到了哪些实质性的帮助,这里敲黑板,可能其中的一到两条就是你想要的。1 简单我是写Java的,GoEasy里有自己的依赖包,我从注册到获取APP...
3 替代websocket_WebSocket基础讲解(2)
weixin_31742467的博客
01-12 242
0.引言本篇文章主要讲解如何在服务端使用websocket。如果在服务端使用websocket,那就需要使用Node.js,就需要安装nodejs-websocket。也可以参考前面的文章进行学习:WebSocket基础讲解(1) nodejs入门的学习教程:https://www.runoob.com/nodejs/nodejs-tutorial.html1.NodeJs简述Node.js 是一...
直播弹幕系统(五)- 整合Stomp替换原生WebSocket方案探究
Zong_0915的博客
12-23 2471
本篇文章是基于SpringBoot - WebSocket的使用和聊天室练习来讲解的。在设计弹幕系统(目前还是从设计聊天室开始入手,弹幕的React实现后面会开始写)这块,我还是用最原生的WebSocket来进行的。对于服务端而言。无非就是添加注解修饰,通过@OnOpen进行监听等操作。但是最最最重要的一点是,这种设计系统,WebSocket信息是存储于本地缓存的。而且,在分布式架构下,还需要考虑到消息的一致性。因此本篇文章,先简单了解下Stomp以及它的聊天室替代方案实现。,即简单文本定向消息协议。
用 Rust 实现一个替代 WebSocket 的协议
最新发布
weixin_42660646的博客
06-22 1351
用 Rust 实现一个可以替代 WebSocket 的全双工端对端加密协议
websocket和ajax的区别是什么,websocket的应用场景有哪些
SevenLee的个人博客
09-15 422
WebSocket则提供使用一个TCP连接进行双向通讯的机制,一种在单个TCP连接上进行全双工通信的协议。WebSocket基于http协议,借用了HTTP的协议来完成一部分握手,WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。...
http3 替代websocket_关于Socket,看我这几篇就够了(三)原来你是这样的Websocket
weixin_39946534的博客
01-14 534
在上一篇中,我们介绍了HTTP协议。HTTP协议是一种无状态、无连接的协议。在HTTP 1.1 版本之前,客户端到服务器的TCP/IP连接是使用完毕便断开的,而服务器的TCP/IP的socket层是有开销的,而客户端又很可能请求多次连接,每次建立连接都需要进行三次握手,断开连接需要进行四次挥手,我们便可以思考如何简化这些步骤。于是,HTTP 1.1的版本中,便正式增加了一系列头部字段如Connec...
 websocket
09-12
WebSocket是HTML5下一种新的协议,它实现了浏览器与服务器全双工通信,能更好地节省服务器资源和带宽,并达到实时通讯的目的。WebSocket是一个持久化的协议,通过握手机制,客户端和服务器之间可以建立一个类似于TCP的连接,从而方便它们之间的通信。在WebSocket出现之前,web交互一般是基于HTTP协议的短连接或者长连接。WebSocket是一种全新的协议,不属于HTTP无状态协议,协议名为"ws"。 WebSocket与HTTP的关系是,WebSocket在建立握手时,数据是通过HTTP传输的。但是,在真正传输数据时,WebSocket不需要HTTP协议。不同点是,WebSocket是双向通信协议,可以双向发送或接受信息,模拟了Socket协议;而HTTP是单向的,浏览器发起向服务器的连接,服务器预先并不知道这个连接。
写文章

热门文章

  • 完美解决Unable to find the VMX binary ‘C:\Program Files (x86)\VMware\VMware Workstation\vmware-vmx.exe‘. 15030
  • MySQL --- 多表查询 & 驱动表 9762
  • 一次搞懂Java异常处理(超详细!!!)! 9095
  • Java正则表达式详解 6242
  • MySQL --- 图形化工具&DDL表结构操作 5729

分类专栏

  • 操作系统 8篇
  • Spring Framework 2篇
  • JavaSE 56篇
  • Spring Boot Web 13篇
  • JVM 3篇
  • MySQL 15篇
  • MyBatis 3篇
  • Linux 6篇

最新评论

  • 完美解决Unable to find the VMX binary ‘C:\Program Files (x86)\VMware\VMware Workstation\vmware-vmx.exe‘.

    Kyrie Irving757: 感谢万能的网友,万分感谢。

  • Redis的集群模式:主从 & 哨兵 & 分片集群

    GaoSSR: 前两天刚去上海玩儿回来表情包

  • Redis的集群模式:主从 & 哨兵 & 分片集群

    CarpeDiemsjjd: slaveof 在Redis5.0之后也可以使用 表情包

  • 点击Path环境变量编辑不展开的问题

    GaoSSR: 优先级导致覆盖了

  • 一次搞懂Java异常处理(超详细!!!)!

    *非与或 *: 非常全面

最新文章

  • 大模型里的 Token 到底是什么?它是计算机的令牌或者区块链的数字化资产吗?
  • Maven - Plugins报错的正确解决之道
  • 《Git学习笔记:IDEA整合Git》
2024年10篇
2023年179篇
2022年7篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GaoSSR

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家新款玻璃钢雕塑美人鱼昆山商场开业美陈玻璃钢园林雕塑制造厂家丽江玻璃钢花盆临安区玻璃钢雕塑私人定做临安区玻璃钢金属雕塑介绍龙泉玻璃钢雕塑厂商销售玻璃钢雕塑模具制造杭州商场国庆美陈邯郸玻璃钢仿铜雕塑广东景观玻璃钢雕塑加工厂广东玻璃钢金属雕塑厂家商场外部美陈摆设邢台玻璃钢仿铜雕塑厂家禅城仿真玻璃钢人物雕塑一键成交玻璃钢景观雕塑电话北京抽象玻璃钢雕塑销售厂家世界玻璃钢雕塑镇江玻璃钢卡通雕塑定制河北玻璃钢雕塑材质深圳迎宾玻璃钢雕塑宁波做玻璃钢雕塑焦作景观标识校园玻璃钢景观雕塑四川商业商场美陈哪家好商场美陈布置的作用嘉兴人物玻璃钢雕塑批发淮北特色玻璃钢雕塑海南玻璃钢雕塑节庆美陈小品做玻璃钢雕塑培训公司广州玻璃钢狮身雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化