WebSocket

WebSocket

WebSocket 事HTML5开始提供的一种在单个TCP连接上进行的双工通讯的协议,可以在html页面直接使用。

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

1,WebSocket 事件

以下是WebSocket对象的相关事件

事件事件处理程序描述
openSocket.onopen建立连接时触发
messageSocket.onmessage客户端接受服务器数据时触发
errorSocket.onerror通讯发生错误是触发
closeSocket.onclose连接关闭是触发

2,WebSocket方法

以下是WebSocket对象的相关方法

方法描述
Socket.send()使用连接发送信息
Socket.close()关闭连接

3,WebSocket聊天室

3.1,引入websocket依赖

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></exclusion></exclusions></dependency>

3.2,编写websocket工具类

package com.woniu.util;import javax.websocket.RemoteEndpoint;
import javax.websocket.Session;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;public class WebSocketUtil {//放所有参与聊天的用户标识public static final Map<String, Session> messageMap = new ConcurrentHashMap<>();/***单个消息*/public static void send(Session session,String message){if (session != null){final RemoteEndpoint.Basic basic = session.getBasicRemote();if (basic != null){try {basic.sendText(message);} catch (IOException e) {e.printStackTrace();}}}}/*** 全体发消息*/public static void sendAll(String message){messageMap.forEach((userName,session) -> send(session,message));}}

3.3,编写websocket事件类

package com.woniu.webscoket;import com.woniu.util.WebSocketUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RestController;import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;@RestController
@ServerEndpoint("/WebSocketHandler/{userName}")
public class WebSocketHandler {@OnOpenpublic void openSession(@PathParam("userName") String userName, Session session){String message = "欢迎:"+userName +"加入群聊";WebSocketUtil.messageMap.put(userName,session);//给所有人发消息WebSocketUtil.sendAll(message);}@OnMessagepublic void onMessage(@PathParam("userName") String userName, String message){message = userName +":" +message;WebSocketUtil.sendAll(message);}@OnClosepublic void onClose(@PathParam("userName") String userName,Session session){WebSocketUtil.messageMap.remove(userName);WebSocketUtil.sendAll("用户:"+userName+"离开聊天室");try {session.close();} catch (IOException e) {e.printStackTrace();}}
}

3.4,编写WebSocketConfig 配置类, 并在启动类上加上 @EnableWebSocket 注解

@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter(){return new ServerEndpointExporter();}
}

3.5,如果是springsecurity框架需要给websocket配免拦截

    //忽略websocket拦截@Overridepublic void configure(WebSecurity webSecurity) {webSecurity.ignoring().antMatchers("/WebSocketHandler/**");}

3.6,报错解决

​ 类似:ailed to register @ServerEndpoint class,在test类加上

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

3.7,前端代码

<template><div><el-row ><el-col :span="6" :offset="3"> <p style="font-">1号聊天室</p></el-col></el-row><el-row><el-col :span="12" :offset="1"> <textarea id="textarea" disabled="disabled" cols="50" rows="10"></textarea></el-col></el-row><el-row><el-col :span="24"><span>  用户名:</span><span>  <el-input type="text" v-model="userName"/></span><span>  <el-button type="primary" @click="join">加入聊天室</el-button></span></el-col></el-row><el-row><el-col :span="4" :offset="1"> <el-input type="text" v-model="message"/> </el-col><el-col :span="4" ><el-button type="success" @click="send">发送</el-button></el-col></el-row></div>
</template><script>export default {data(){return{url:'ws://192.168.2.70:8083/WebSocketHandler/',ws:'',userName:'',message:''}  },methods:{join(){if(this.userName == ""){alert("请输入您的大名!")}this.ws = new WebSocket(this.url + this.userName);this.ws.onopen = function(){console.log("连接成功!")}this.ws.onmessage = function(result){var textarea = document.getElementById("textarea");textarea.append(result.data+'\n');textarea.scrollTop = textarea.scrollHeight;}this.ws.onclose = function(){var textarea = document.getElementById("textarea");textarea.append('用户:'+this.userName+'离开聊天室 \n');  console.log("")}},send(){if(this.ws != null){this.ws.send(this.message);this.message = "";}}}
}
</script><style scoped>
p{font-size: 20px;color: red;
}
.el-row{margin:10px 5px;
}
span{float: left;
}
</style>

3.8,效果图

在这里插入图片描述

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

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

相关文章

JVM类加载机制

一、类的加载过程&#xff08;从磁盘到内存的过程&#xff09; 1、整体过程概述 我们首先以一个类举例&#xff0c;一个类的加载首先是通过某个main函数启动程序时&#xff0c;通过类加载器把主类加载到jvm中&#xff0c;如&#xff1a; package com.gaorufeng.jvm;public c…

远程桌面发生身份验证错误,要求的函数不受支持

windows10专业版&#xff1a; 解决方法&#xff1a; 使用微软官方建议修改本地组策略&#xff1a; winr弹出运行窗口&#xff0c;输入gpedit.msc,打开本地组策略 计算机配置>管理模板>系统>凭据分配>加密Oracle修正 选择启用并选择易受攻击。 windows10家庭版&a…

如何调用百度地图API

前言 要调用百度地图API&#xff0c;步骤操作如下 注册并创建一个API密钥。您可以在百度地图API控制台上创建您的密钥。选择要使用的API服务。百度地图API提供了多种服务&#xff0c;包括地图展示、路线规划、地点搜索、实时交通等。您可以在百度地图API控制台上查看所有可用…

【Linux进程】进程状态 {进程状态的介绍,进程状态的转换,Linux中的进程状态,浅度睡眠VS深度睡眠,僵尸进程VS孤儿进程,调度器的作用}

进程状态 一、基本进程状态 1.1 进程状态介绍 创建状态&#xff1a;当一个进程被创建时&#xff0c;它处于创建状态。在这个阶段&#xff0c;操作系统为进程分配必要的资源&#xff08;将代码和数据拷贝到内存&#xff0c;创建PCB结构体等&#xff09;&#xff0c;并为其分配一…

从0到1精通自动化测试,pytest自动化测试框架,配置文件pytest.ini(十三)

一、前言 pytest配置文件可以改变pytest的运行方式&#xff0c;它是一个固定的文件pytest.ini文件&#xff0c;读取配置信息&#xff0c;按指定的方式去运行 二、ini配置文件 pytest里面有些文件是非test文件pytest.ini pytest的主配置文件&#xff0c;可以改变pytest的默认…

Android Binder通信原理(三):service注册

源码基于&#xff1a;Android R 0. 前言 上一文中详细分析了servicemanger 的启动流程&#xff0c;我们知道 servicemanager 作为 binder 机制中的一个特殊service&#xff0c;利用service map管理所有service&#xff0c;也是所有binder 通信的入口。 本文着重分析 service …

智能文档图像处理技术应用与实践

写在前面智能文档处理面临的技术难题智能文档处理的研究领域● 文档图像分析与预处理● 手写板反光擦除● 版面分析与文档还原 写在最后 写在前面 VALSE 2023 无锡视觉与学习青年学者研讨会近期在无锡国际博览中心举办&#xff0c;由江南大学和无锡新吴区联合承办。本次会议旨…

netty学习(1):多个客户端与服务器通信

1. 基于前面一节netty学习&#xff08;1&#xff09;:1个客户端与服务器通信 只需要把服务器的handler改造一下即可&#xff0c;通过ChannelGroup 找到所有的客户端channel&#xff0c;发送消息即可。 package server;import io.netty.channel.*; import io.netty.channel.gr…

陪诊小程序系统|陪诊软件开发|陪诊系统功能和特点

随着医疗服务的逐步改善和完善&#xff0c;越来越多的人群开始走向医院就诊&#xff0c;而其中不少人往往需要有人陪同前往&#xff0c;这就导致了许多矛盾与问题的发生&#xff0c;比如长时间等待、找不到合适的陪诊人员等。因此为人们提供一种方便快捷的陪诊服务成为了一种新…

成本降低60%至70%?中国展现顶级电池技术,锂电就是下一个铅酸

在3月份&#xff0c;宁德时代宣布加速推进钠离子电池产业化&#xff0c;以降低成本并提供差异化产品和技术&#xff0c;帮助客户提升产品竞争力和占据更大市场份额。孚能科技已在上半年开始批量生产钠离子电池&#xff0c;而拓邦股份也在最近的国际电池技术展上发布了自家的钠离…

vue下基于elementui自定义表单-后端数据设计篇

vue下基于elementui自定义表单-后端篇 自定义表单目前数据表单设计是基于数据量不大的信息单据场景&#xff0c;因为不考虑数据量带来的影响。 数据表有: 1.表单模版表&#xff0c;2.表单实例表&#xff0c;3.表单实例项明细表&#xff0c;4表单审批设计绑定表 以FormJson存…

【动态规划】LeetCode 583. 两个字符串的删除操作 Java

583. 两个字符串的删除操作 我的代码&#xff0c;错误代码&#xff0c;只考虑到了字母出现的次数&#xff0c;没有考虑到两个字符串中字母出现的顺序 class Solution {public int minDistance(String word1, String word2) {int[] arr1 new int[26];int[] arr2 new int[26];…