WebSocket建立网络连接——小案例

WebSocket是一种实现全双工通信的网络技术标准,它允许在用户的浏览器和服务器之间进行持久的、双向的通信。以下是对WebSocket的具体介绍:

  1. 实时性:与传统HTTP请求相比,WebSocket提供了更高效的实时数据交换方式。一旦建立连接,客户端与服务端可以同时相互发送信息,而不需要像HTTP那样每次请求都要重新建立连接。
  2. 持久连接:WebSocket建立在TCP协议之上,它使用一次“握手”来建立连接,此后便可以在客户端和服务器之间保持一个持久的连接状态,直到其中一方主动关闭连接。
  3. 低延迟:由于WebSocket支持长连接和双向通信,它可以显著减少网络延迟,尤其适用于需要快速响应的场景,例如在线游戏、实时通知等。
  4. 轻量级:虽然WebSocket基于HTTP协议,但它有自己的专门协议,这使得它在传输效率上更高,头部信息更小,减少了额外的数据传输开销。
  5. 兼容性:WebSocket协议得到了现代浏览器的广泛支持,并且由W3C定为标准。同时,它也通过RFC 6455和RFC 7936被IETF确定为标准。
  6. 适用场景:WebSocket特别适用于那些需要服务器主动向客户端推送数据的应用场景,如聊天室、实时监控图表更新展示等。

首先创建客户端WebSocket:

 WebSocketClient.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>WS_Client</title>
</head>
<body>
<input id="msg" type="text">
<button onclick="send()">发送消息</button>
</body>
<script>//连接WebSocket 服务器const clientId = Math.random().toString(36).substr(2);const websocket = new WebSocket("ws://localhost:8080/ws/" + clientId);//监听连接建立成功websocket.onopen = function (){console.log("WebSocket建立连接成功……")}//监听收到服务端消息websocket.onmessage = function (event){console.log(event.data);}//发送消息function send(){websocket.send(document.getElementById('msg').value);}//监听窗口关闭事件,当窗口关闭时主动去关闭webSocket连接window.onbeforeunload = function (){websocket.close();}
</script>
</html>

现在编写服务端WebSocketServe:

引入相关依赖:

        <!--    websocket    --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>

编写WebSocketServer服务端:

package net.wanho.webSocket;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.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;@Component
@ServerEndpoint("/ws/{cid}")
public class WebSocketServer {//存放会话对象private static Map<String, Session> sessionMap = new HashMap<>();/*** 监听连接建立成功*/@OnOpenpublic void onOpen(Session session, @PathParam("cid") String cid){System.out.println("客户端:" + cid + "建立连接……");sessionMap.put(cid,session);}/*** 监听收到客户端消息*/@OnMessagepublic void onMessage(String msg,@PathParam("cid") String cid){System.out.println("这是来自于客户端:" + cid + "的消息:" + msg);}/*** 监听连接关闭* @param cid*/@OnClosepublic void  onClose(@PathParam("cid") String cid){System.out.println("连接断开:" + cid);sessionMap.remove(cid);}/*** 群发消息*/public void sendToAllClient(String msg){Collection<Session> sessions = sessionMap.values();for (Session session : sessions) {try {//服务器向客户端发送消息session.getBasicRemote().sendText(msg);} catch (IOException e) {e.printStackTrace();}}}
}

编写WebSocket配置类:

/*** WebSocket配置类,用于注册WebSocket服务端组件*/
@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter(){return new ServerEndpointExporter();}
}

 编写定时任务,用于向客户端发送信息:

@Component
public class MyWebSocketTask {@Resourceprivate WebSocketServer webSocketServer;/*** 通过WebSocket每隔5s向客户端发送信息*/@Scheduled(cron = "0/3 * * * * ?")public void sendMessageToClient(){String format = DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now());webSocketServer.sendToAllClient("这是来自服务端的消息:" + format);}
}

在启动类开启定时任务:

@SpringBootApplication
@EnableScheduling //开启定时任务
public class ExcelProjectApplication {public static void main(String[] args) {SpringApplication.run(ExcelProjectApplication.class, args);}}

测试结果: 

 

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

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

相关文章

数字序列比大小 - 贪心思维

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、java代码五、测试用例 前言 本人最近再练习算法&#xff0c;所以会发布自己的解题思路&#xff0c;希望大家多指教 一、题目描述 A&#xff0c;B两个人万一个数字的游戏&#xff0c;在游戏前…

Python 求高斯误差函数 erf 和 erfc

文章目录 Part.I IntroductionPart.II 概念定义Chap.I 误差函数 erfChap.II 误差函数补 erfc Part.II 求值与绘图Chap.I 求取方式Chap.II 绘图 Reference Part.I Introduction 本文将对误差函数&#xff08;ERror Function, ERF&#xff09;进行简单的介绍&#xff0c;并探索如…

内网安全-隧道技术SSHDNSICMPSMB上线通讯LinuxMac 简单总结

第126天&#xff1a;内网安全-隧道技术&SSH&DNS&ICMP&SMB&上线通讯Linux&Mac_内网安全-隧道技术_ssh_dns_icmp_smb_上线通讯linux_mac-CSDN博客 内网渗透—隧道技术_隧道技术csdn-CSDN博客 #SMB 隧道&通讯&上线 判断&#xff1a;445 通讯 上…

优秀博士学位论文分享:面向数据流模型的代码生成技术研究

优秀博士学位论文代表了各学科领域博士研究生研究成果的最高水平&#xff0c;本公众号近期将推出“优秀博士学位论文分享”系列文章&#xff0c;对人工智能领域2023年优秀博士学位论文进行介绍和分享&#xff0c;方便广大读者了解人工智能领域最前沿的研究进展。 “博士学位论…

五子棋对战(网页版)

目录 一、项目背景 用户模块 匹配模块 对战模块 二、核心技术 三、相关知识 WebSocket 原理 报文格式 代码 服务器代码 客户端代码 四、项目创建 4.1、实现用户模块 编写数据库代码 数据库设计 配置MyBatis 创建实体类 创建UserMapper 创建UserMapper接口 实现UserMapper.xml 前…

工作太闲,平常有没有用手机能赚钱的,这里我推荐了4种可月入2000的副业

确实有许多通过手机赚钱的方式&#xff0c;以下是一些常见的方法 1.拍照卖图 如果你有一台相机或智能手机&#xff0c;喜欢拍照&#xff0c;那么可以将自己拍摄的图片上传到网站上&#xff0c;赚取稿费。 2. 做问卷调查 许多公司需要了解消费者的意见&#xff0c;所以会通过…

C语言学习(十)结构体

目录 一、结构体类型定义二、结构体变量的定义三、结构体变量赋值1. 定义结构体变量的同时进行赋值2. 定义结构体类型的同时定义变量并进行赋值3. 在定义结构体变量时对指定成员进行赋值4. 在定义完结构体变量后&#xff0c;通过.进行赋值 四、结构体成员访问五、结构体内部指针…

zabbix基础

监控系统基本介绍&#xff1a; 企业级应用中&#xff0c;服务器数量众多&#xff0c;一般情况下需要维护人员进行长时间对服务器体系、计算机或其他网络设备&#xff08;包括硬件和软件&#xff09;进行长时间进行性能跟踪&#xff0c;保证正常稳定安全的运行&#xff0c;于是…

Vue从入门到实战Day05

一、自定义指令 自定义指令&#xff1a;自己定义的指令&#xff0c;可以封装一些dom操作&#xff0c;扩展额外功能 需求&#xff1a;当页面加载时&#xff0c;让元素将获得焦点 (autofocus在safari浏览器有兼容性) 操作dom&#xff1a;dom元素.focus() mounted() {this.$ref…

3W 3KVAC隔离 宽电压输入 AC/DC 电源模块——TP03AC 系列

TP03AC系列电源模块额定输出功率为3W&#xff0c;此系列产品输入电压范围宽&#xff0c;可以交直流两用。并具备高可靠性、高精度、更安全、更稳定&#xff0c;大功率密度&#xff0c;超小体积&#xff0c;无需外加散热器&#xff0c;输出电压稳定等特点&#xff0c;且均集成有…

‘vue-cli-service‘ is not recognized as an internal or external command解决方案

vue-cli-service is not recognized as an internal or external command, operable program or batch file.解决方案 先进行 &#xff1a; npm install -g vue/cli 命令安装vue cli 是必须的。 如果 npm run build 还是报错 遇到同样的提示&#xff1a; 这时候先安装依赖 np…

线上科博馆3d云展馆实现企业拥抱数字化的目标

在科技日新月异的今天&#xff0c;数字化展览正逐渐成为各行业展示与推广的新宠。地产、家居、电商、文博、党建等领域纷纷拥抱数字化&#xff0c;寻求更生动、更直观的展示方式。而Web3D虚拟展厅开发工具&#xff0c;正是这一变革的得力助手。 Web3D虚拟展厅开发工具以其傻瓜式…