WebSocket详解、WebSocket入门案例

目录

1.1 WebSocket介绍

http协议:

webSocket协议:

1.2WebSocket协议:

1.3客户端(浏览器)实现

1.3.2 WebSocket对象的相关事宜:

1.3.3 WebSOcket方法

1.4 服务端实现

服务端如何接收客户端发送的请求呢?

服务端如何推送数据给客户端呢?


1.1 WebSocket介绍

WebSocket 是一种网络通信协议。

        WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通信的协议。

        HTTP 协议是一种无状态、无连接、单向的应用层协议。它采用了 请求/响应 模型。通信请求只能由客户端发起,服务端对请求做出应答处理。(单向的:采用的是请求+响应的模式)

        这种通信模型有一个弊端:HTTP协议无法实现服务器主动向客户端发起消息。

        这种单项请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。大多数Web应用程序将通过频繁的异步ajax请求实现长轮询。轮询效率低,非常浪费资源(必须不停的连接,或者HTTP连接始终打开)

http协议:

webSocket协议:

1.2WebSocket协议:

        WebSocket协议有两个部分,握手和数据传输

        握手时基于http协议,在数据传输阶段基于WebSocket协议

1.3客户端(浏览器)实现

var ws = new WebSocket(url);
//参数url格式说明: ws://ip地址:端口号/资源名称

1.3.2 WebSocket对象的相关事宜:

事件

事件处理程序

描述

open

websocket对象.onopen

连接建立时触发

message

websocket对象.onmessage

客户端接收服务端数据时触发

error

websocket对象.onerror

通信发生错误时触发

close

websocket对象.onclose

连接关闭时触发

1.3.3 WebSOcket方法

WebSocket对象的相关方法:

方法

描述

send()

使用连接发送数据

1.4 服务端实现

Java WebSocket应用一系列的WebSocketEndpoint组成。Endpoint是一个java对象,代表WebSocket链接的一端,对于服务端,我们可以视为处理具体WebSocket消息的接口。【一个EndPoint对象和一个客户端产生一一对应的关系】

我们可以通过两种方式定义Endpoint:

  • 编程式:继承类 javax.websocket.Endpoint并实现其方法。
  • 注解式:即定义一个POJO,并添加@ServerEndpoint相关注解

Endpoint实例在WebSocket握手时创建,并在客户端与服务端连接过程中有效,最后在链接关闭时结束。在Endpoint接口中明确了定义与其生命周期相关的方法,生命周期方法如下:

方法

含义描述

注解

onClose

当会话关闭时调用。

@OnClose

onOpen

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

@OnOpen

onError

当连接过程中异常时调用。

@OnError

服务端如何接收客户端发送的请求呢?

通过为Session添加MessageHandler消息处理器来接收消息,当采用注解方式定义EndPoint时,我们还可以通过@OnMessage注解指定接收消息的方法。

服务端如何推送数据给客户端呢?

发送消息则由 Remote Endpoint完成,其实例由Session维护,根据使用情况,我们可以通过Session.getBasicRemote 获取同步消息发送的实例,然后调用其 sendXxx( )方法就可以发送消息,可以通过Session.getAsyncRemote获取异步消息发送实例。

下面是一个简单的案例:

@ServerEndpoint("/robin")
public class ChatEndPoint {private static Set<ChatEndPoint> webSocketSet = new HashSet<>();private Session session;@OnMessagepublic void onMessage(String message, Session session) throws IOException {System.out.println("接收的消息是:" + message);System.out.println(session);//将消息发送给其他的用户for (Chat chat : webSocketSet) {if(chat != this) {chat.session.getBasicRemote().sendText(message);}}}@OnOpenpublic void onOpen(Session session) {this.session = session;webSocketSet.add(this);}@OnClosepublic void onClose(Session seesion) {System.out.println("连接关闭了。。。");}@OnErrorpublic void onError(Session session,Throwable error) {System.out.println("出错了。。。。" + error.getMessage());}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/61364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【图像分割】SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers

SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers 论文链接&#xff1a;http://arxiv.org/abs/2105.15203 代码链接&#xff1a;https://github.com/NVlabs/SegFormer 一、摘要 文中提出了SegFormer&#xff0c;一个简单、高效且强大的…

HarmonyOS知识点

HarmonyOS应用模型Stage&FA 、ArkTS、ArkUI Stage模型&#xff1a; Module - UIAbility - Page - component 装饰器Entry、Component、CustomDialog、State、关键字struct、函数build() 系统组件&#xff08;Text Column Row Scroll&#xff09;、自定义组件 、组件复用、…

速盾:CDN是否支持屏蔽IP?

CDN&#xff08;内容分发网络&#xff09;是一种用于提高网站性能和可靠性的技术&#xff0c;通过将内容分发到距离终端用户更近的节点&#xff0c;减少了数据传输的延迟并提高了用户体验。在CDN中&#xff0c;屏蔽IP是一项重要的功能&#xff0c;可以帮助网站屏蔽无效或恶意请…

Linux修改/etc/hosts不起作用(ping: xxx: Name or service not known)的解决方法——开启NSCD

​ 问题描述 起因是我在实验室云资源池的一台虚拟机&#xff08;CentOS 8.5&#xff09;上的/etc/hosts文件中为Fabric网络节点的域名指定了IP&#xff1a; IP可以ping通&#xff0c;但是ping域名时提示ping: xxx: Name or service not known。 问题本身应该是Linux通用的&a…

OpenTelemetry 赋能DevOps流程的可观测性革命

原作者&#xff1a;天颇 原出处&#xff1a;微信公众号 乘云数字DATABUFF 原文地址&#xff1a;https://mp.weixin.qq.com/s/D_f31EBtLu7Rr0gahuF-bw 引言 在当今快节奏的软件开发和运维环境中&#xff0c;DevOps 已经成为主流&#xff0c;它通过整合开发和运维流程&#xff0…

学了Arcgis的水文分析——捕捉倾泻点,河流提取与河网分级,3D图层转要素失败的解决方法,测量学综合实习网站存着

ArcGIS水文分析实战教程&#xff08;7&#xff09;细说流域提取_汇流域栅格-CSDN博客 ArcGIS水文分析实战教程&#xff08;6&#xff09;河流提取与河网分级_arcgis的dem河流分级-CSDN博客 ArcGIS水文分析实战教程&#xff08;5&#xff09;细说流向与流量-CSDN博客 ArcGIS …

windows 和 linux检查操作系统基本信息

windows检查操作系统基本信息 systeminfolinux检查操作系统基本信息 获取系统位数 getconf LONG_BIT查询操作系统release信息 lsb_release -a查询系统信息 cat /etc/issue查询系统名称 uname -a

gitHub常用操作

gitHub常用操作 1、把项目拉下来2、添加上游仓库3、进入分支4、从上游仓库拉取更新 1、把项目拉下来 在对应项目的右上角点击fork&#xff0c;fork下来&#xff1a;将远程仓库复制到个人仓库 在创建好的分支文件夹下使用 git clone自己远程仓库下的http地址&#xff08;fork…

使用SaaS化的Aurora应用快速搭建私人ChatGPT助手

使用SaaS化的Aurora应用快速搭建私人ChatGPT助手 简介&#xff1a; Aurora是一个带UI且免费的GPT私人聊天助手&#xff0c;可切换GPT-3.5&#xff0c;4&#xff0c;4o等常用版本。用户可通过部署Aurora&#xff0c;快速打造自己专属的AI助手。阿里云计算巢已将Aurora打包为SaaS…

Android开发实战班 -网络编程 - Retrofit 网络请求 + OkHttp 使用详解

在现代 Android 应用开发中&#xff0c;网络编程是必不可少的一部分。Retrofit 是 Square 公司推出的一款类型安全的 HTTP 客户端库&#xff0c;简化了与 RESTful API 的交互。Retrofit 基于 OkHttp&#xff0c;并提供了简洁的接口定义和强大的功能&#xff0c;如异步请求、请求…

ASFSSA-VMD多策略改进的麻雀搜索算法优化变分模态分解

ASFSSA-VMD多策略改进的麻雀搜索算法优化变分模态分解 目录 ASFSSA-VMD多策略改进的麻雀搜索算法优化变分模态分解效果分析基本介绍程序设计参考资料效果分析 基本介绍 (创新独家)ASFSSA-VMD多策略改进的麻雀搜索算法优化变分模 态分解ASFSSA-VMD:优化VMD分解层数K和惩罚因子a…

Unity脚本基础规则

Unity脚本基础规则 如何在Unity中创建一个脚本文件&#xff1f; 在Project窗口中的Assets目录下&#xff0c;选择合适的文件夹&#xff0c;右键&#xff0c;选择第一个Create&#xff0c;在新出现的一栏中选择C# Script&#xff0c;此时文件夹内会出现C#脚本图标&#xff0c;…

【新华妙笔-注册/登录安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

Dart:字符串

字符串&#xff1a;单双引号 String c hello \c\; // hello c&#xff0c;单引号中使用单引号&#xff0c;需要转义\ String d "hello c"; // hello c&#xff0c;双引号中使用单引号&#xff0c;不需要转义 String e "hello \“c\”"; // hell…

使用vscode+expo+Android夜神模拟器运行react-native项目

1.进入夜神模拟器安装路径下的bin目录 2.输入命令&#xff0c;连接Android Studio 启动夜神模拟器后&#xff0c; 打开安装目录的bin文件夹执行下面的命令&#xff0c;只需执行一次&#xff09; nox_adb.exe connect 127.0.0.1:62001adb connect 127.0.0.1:62001 3.运行项目…

从0安装mysql server

安装 MySQL Server 首先,你需要在 Ubuntu 上安装 MySQL 服务器。运行以下命令来安装:sudo apt update sudo apt install mysql-server安装完成后,MySQL 服务会自动启动。你可以通过以下命令检查 MySQL 服务是否正在运行: sudo systemctl status mysql如果 MySQL 正在运行,…

自动计算机视觉功能技术方向

近年来&#xff0c;随着自动计算机视觉功能的不断发展&#xff08;如跟踪、目标/活动识别等&#xff09;的技术方向&#xff0c;这些技术在无人机应用领域中的重要性也日益凸显。同时&#xff0c;得益于低成本商用无人机的日益普及&#xff0c;这些技术得到了快速的推广和应用。…

Linux进阶:软件安装、网络操作、端口、进程等

软件安装 yum 和 apt 均需要root权限 CentOS系统使用&#xff1a; yum [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y&#xff0c;自动确认 Ubuntu系统使用 apt [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y&…

C语言 蓝桥杯某例题解决方案(查找完数)

蓝桥杯原题&#xff1a; 一个数如果恰好等于它的因子之和&#xff0c;这个数就称为“完数”。例如6 1 2 3.编程找出1000以内的所有完数。 这个题没有很大的难点&#xff0c;与我们上一个解决的问题“质因数分解”不同&#xff0c;它不需要判断因数是否是质数&#xff0c;因此…

linux先创建文件夹后指定创建文件夹用户

1、创建文件夹&#xff0c;然后创建用户并指定用户目录&#xff0c;然后修改目录所有权给该目录 # 创建 /home/test 目录 mkdir /home/test # 设置权限&#xff08;确保有适当的读写权限&#xff09; chown root:root /home/test chmod 700 /home/test # 创建 xl 用户并指定家…