当前位置: 首页 > news >正文

站长推荐跳转网站建设 东道网络

站长推荐跳转,网站建设 东道网络,仿网站 涉及侵权吗,网站建设与网页设计试卷SpringBoot系列之ServerEndpoint方式开发WebSocket应用。在实时的数据推送方面#xff0c;经常会使用WebSocket或者MQTT来实现#xff0c;WebSocket是一种不错的方案#xff0c;只需要建立连接#xff0c;服务端和客户端就可以进行双向的数据通信。很多网站的客户聊天…SpringBoot系列之ServerEndpoint方式开发WebSocket应用。在实时的数据推送方面经常会使用WebSocket或者MQTT来实现WebSocket是一种不错的方案只需要建立连接服务端和客户端就可以进行双向的数据通信。很多网站的客户聊天也经常使用WebSocket技术来实现。 WebSocket简介 WebSocket是一种建立在TCP协议上的一种网络协议与Http协议类似端口都是80或者443协议标识符是ws、如果是加密安全的就是wss这个和http/https有点类似。WebSocket 连接以 HTTP 请求/响应握手开始连接成功后客户端可以向服务端发送消息反之亦可WebSocket协议支持二进制数据和文本字符串的传输。因为客户端和服务端之间只有一条TCP通信连接以后所有的请求都使用这条连接所以Websocket也是属于长连接。下面给出WebSocket通讯示意图 WebSocket官网给出的HTTP和WebSocket的对比图https://websocket.org/guides/road-to-websockets 实验环境准备 JDK 1.8SpringBoot 3.3.0Maven 3.3.9开发工具 IntelliJ IDEAsmartGit 新建WebSocket项目 在idea里新建一个module选择Spring Initializr项目默认选择Spring官网的https://start.spring.io 选择需要的依赖这里可以选择Springboot集成的WebSocket starter 生成项目后检查一下对应Maven配置文件中是否有加上spring-boot-starter-websocket dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-websocket/artifactId /dependency如果不是Springboot项目加入spring-websocket即可 dependencygroupIdorg.springframework/groupIdartifactIdspring-websocket/artifactIdversion5.2.1.RELEASE/versionscopecompile/scope/dependency创建ServerEndpoint 创建一个Websocket的ServerEndpoint类这个类是为了创建一个WebSocket服务端这个类使用线程安全的CopyOnWriteArrayList集合来存储所有的WebSocket对象再自定义一个socketClientCode目的是为了客户端只和对应的服务端通信客户端建立连接会进入onOpen方法发送消息会调用onMessage方法 package com.example.springboot.websocket.message;import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component;import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.concurrent.CopyOnWriteArrayList;ServerEndpoint(/ws/webSocketServer) Component Slf4j public class WebSocket {private static final String PREFIX socketClient;private String socketClientCode;private static CopyOnWriteArrayListWebSocket webSocketSet new CopyOnWriteArrayList();private Session session ;OnOpenpublic void onOpen(Session session) {this.session session;webSocketSet.add(this);log.info(open a webSocket {}, online num: {},getSocketClientCode(), getOnlineNum());}OnClosepublic void onClose() {webSocketSet.remove(this);log.error(close a webSocket {}, online num:{}, getSocketClientCode(), getOnlineNum());printOnlineClientCode();}OnErrorpublic void onError(Session session, Throwable error) {webSocketSet.remove(this);log.error(webSocket error {}, {}, online num:{}, error, getSocketClientCode(), getOnlineNum());printOnlineClientCode();}OnMessagepublic void onMessage(String message, Session session) {log.info(receive message from client:{}, message);// 业务实现if (message.startsWith(PREFIX)) {String socketClientCode message.substring(PREFIX.length());this.setSocketClientCode(socketClientCode);sendMessage(message);printOnlineClientCode();} else {sendMessage(message);}}/*** 发送消息** Date 2024/06/19 16:36* Param [message]* return void*/public void sendMessage(String message) {if (!this.session.isOpen()) {log.warn(webSocket is close);return;}try {this.session.getBasicRemote().sendText(message);} catch (IOException e) {log.error(sendMessage exception:{}, e);}}/*** 给客户端发送消息** Date 2024/06/19 16:37* Param [message, socketClientCode]* return void*/public void sendMessageToClient(String message, String socketClientCode) {log.info(send message to client, message:{}, clientCode:{}, message, socketClientCode);printOnlineClientCode();webSocketSet.stream().forEach(ws - {if (StrUtil.isNotBlank(socketClientCode) StrUtil.isNotBlank(ws.getSocketClientCode()) ws.getSocketClientCode().equals(socketClientCode)) {ws.sendMessage(message);}});}/*** 群发消息** Date 2024/06/19 16:37* Param [message]* return void*/public void fanoutMessage(String message) {webSocketSet.forEach(ws - {ws.sendMessage(message);});}private static synchronized int getOnlineNum() {return webSocketSet.size();}private void printOnlineClientCode() {webSocketSet.stream().forEach(ws - {log.info(webSocket online:{}, ws.getSocketClientCode());});}public String getSocketClientCode() {return socketClientCode;}public void setSocketClientCode(String socketClientCode) {this.socketClientCode socketClientCode;} } 加上ServerEndpointExporter 在Springboot项目中为了能扫描到所有的ServerEndpoint需要注入一个ServerEndpointExporter这个类能扫描项目里所有的ServerEndpoint类不加的话客户端会一直连不上服务端 package com.example.springboot.websocket.configuration;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter;Configuration public class WebSocketConfiguration {Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}} 启动SpringBoot项目一个WebSocket服务端就建立好了。网上找一个websocket测试网站https://www.wetools.com/websocket测试一下服务是否正常如图 前端WebSocket客户端 写一个WebSocket调用的客户端启动服务器换一下WebSocket的地址ws://127.0.0.1:8080/ws/webSocketServer如果是https的就换成wss://127.0.0.1:8080/ws/webSocketServer !DOCTYPE html html langen headmeta charsetUTF-8titlewebSocket/titlestyle typetext/css/style /head body h1WebSocket Demo/h1 input typebutton onclickwebsocket.send(666666) value点我发消息/ /body script typeapplication/javascriptvar websocket {send: function (str) {}};window.onload function () {if (!WebSocket in window) return;webSocketInit();};function webSocketInit() {websocket new WebSocket(ws://127.0.0.1:8080/ws/webSocketServer);//建立连接websocket.onopen function () {websocket.send(socketClient666);console.log(成功连接到服务器);};//接收到消息websocket.onmessage function (event) {console.log(event.data);};//连接发生错误websocket.onerror function () {alert(WebSocket连接发生错误);};//连接关闭websocket.onclose function () {alert(WebSocket连接关闭);};//监听窗口关闭window.onbeforeunload function () {websocket.close()};} /script /html走一个在浏览器按F12看看日志 后端的日志打印 服务端给客户端发送消息 给客户端发送消息为了只给对应的客户端发送消息这里加上一个校验只给注册的客户端发送 /*** 给客户端发送消息** Date 2024/06/19 16:37* Param [message, socketClientCode]* return void*/ public void sendMessageToClient(String message, String socketClientCode) {log.info(send message to client, message:{}, clientCode:{}, message, socketClientCode);printOnlineClientCode();webSocketSet.stream().forEach(ws - {if (StrUtil.isNotBlank(socketClientCode) StrUtil.isNotBlank(ws.getSocketClientCode()) ws.getSocketClientCode().equals(socketClientCode)) {ws.sendMessage(message);}}); }写一个API接口 package com.example.springboot.websocket.rest;import cn.hutool.json.JSONUtil; import com.example.springboot.websocket.dto.WebSocketDto; import com.example.springboot.websocket.message.WebSocket; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;RestController RequestMapping(/api) Slf4j public class WebSocketApiController {ResourceQualifier(webSocket)private WebSocket webSocket;PostMappingRequestMapping(/sendMessage)public ResultBeanBoolean sendMessage(RequestBody WebSocketDto sendDto) {log.info(webSocket发送消息给客户端:{}, JSONUtil.toJsonStr(sendDto));try {webSocket.sendMessageToClient(sendDto.getMessage(), sendDto.getSocketClient());return ResultBean.ok(true);} catch (Exception e) {log.error(发送WebSocket消息异常:{}, e);return ResultBean.badRequest(发送WebSocket消息异常, false);}}}
http://www.w-s-a.com/news/409637/

相关文章:

  • 建设企业网站可信度软件产品如何做网站推广
  • 网站建设企业号助手贵阳景观设计公司
  • 网站开发第三方建设银行个人网站显示不了
  • 无锡兼职做网站郑州网站建设搜索优化
  • iis禁止通过ip访问网站品牌策划案例ppt
  • 电子商务网站建设实习seo黑帽优化
  • 如何做好网站建设销售闸北集团网站建设
  • 重庆装饰公司北京官网seo推广
  • 深圳网站设计灵点网络品牌网站充值接口
  • 建设书局 网站国内国际时事图片
  • 成都 网站建设培训学校屏蔽wordpress自带编辑器
  • 公司网站制作工作室中天建设集团有限公司第五建设公司
  • 网站的网页设计毕业设计苏州宣传册设计广告公司
  • 商城网站优化方案注册公司制作网站
  • 政务服务网站建设整改报告wordpress的导航代码
  • 图片素材网站建设做教育网站用什么颜色
  • 快站淘客中转页wordpress商业插件
  • 可信网站网站认证免费软件下载网站免费软件下载网站
  • 小学生网站制作最新域名网站
  • 奖励网站代码设计制作ppt时
  • 茂名优化网站建设门户网站和部门网站的区别
  • 一尊网 又一个wordpress站点wordpress获取当前文章名称
  • 营销型网站多少钱新建网站的外链多久生效
  • 网站空间怎么选择tp5企业网站开发百度云
  • 网站建设saas排名成立公司的流程和要求及费用
  • 网站建设共享骨科医院网站优化服务商
  • 肯尼亚网站域名万能进销存软件免费版
  • 做商城网站价格上海做网站建设
  • 广州制作外贸网站公司阿里云网站模板
  • 做网站为什么要买服务器十堰城市建设网站