网站 数据备份简历设计网站
web/
2025/10/7 10:48:43/
文章来源:
网站 数据备份,简历设计网站,北京软件公司名单,wordpress单栏主题 极简1.基于java注解实现websocket服务器端
1.1需要的类
1.1.1服务终端类
用java注解来监听连接ServerEndpoint、连接成功OnOpen、连接失败OnClose、收到消息等状态OnMessage
1.1.2配置类
把spring中的ServerEndpointExporter对象注入进来
2.1代码示例
2.1.1 maven配置
…
1.基于java注解实现websocket服务器端
1.1需要的类
1.1.1服务终端类
用java注解来监听连接ServerEndpoint、连接成功OnOpen、连接失败OnClose、收到消息等状态OnMessage
1.1.2配置类
把spring中的ServerEndpointExporter对象注入进来
2.1代码示例
2.1.1 maven配置
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.heima/groupIdartifactIdws-demo/artifactIdversion1.0-SNAPSHOT/versionpropertiesmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactIdversion2.7.3/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.16.22/version/dependency!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-websocket --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-websocket/artifactIdversion2.7.14/version/dependency/dependencies/project
2.1.2 WsServerEndpoint类
package com.heima;import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.EnableScheduling;
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.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/**** 监听websocket地址 /myWs*/
ServerEndpoint(/myWs)
Component
Slf4j
EnableScheduling
public class WsServerEndpoint {static MapString,Session map new ConcurrentHashMapString,Session();/**** 连接建立时执行的操作* param session*/OnOpenpublic void onOpen(Session session){map.put(session.getId(),session);log.info(websocket is open);}/**** 收到客户端消息执行的操作* param text*/OnMessagepublic String OnMessage(String text){log.info(收到了一条信息text);return 已收到你的信息 ;}/**** 连接关闭时执行的操作* param session*/OnClosepublic void OnClose(Session session){map.remove(session.getId());log.info(连接关闭时执行的操作);}/**** 向客户端发送信息*/Scheduled(fixedRate 2000)public void sendMsg() throws IOException {for (String key : map.keySet()){map.get(key).getBasicRemote().sendText(你好你好);}}
}2.1.3 WebSocketConfig
package com.heima;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;Configuration
public class WebSocketConfig {Beanpublic ServerEndpointExporter serverEndpointExporter(){return new ServerEndpointExporter();}}2.1.3 前端测试代码
!DOCTYPE html
html langen
headmeta charsetUTF-8titlewsClient/title
/head
bodyscript// 创建websocketlet ws new WebSocket(ws://localhost:8080/myWs)//向服务器发送hellows.onopenfunction (){ws.send(hello)}//监听数据ws://localhost:8080/myWsws.onmessagefunction (message){console.log(message.data)}
/script
/body
/html
2.1.4测试结果
2.1.4.1 当打开浏览器时 2.1.4.2 当关闭浏览器时 2.1.4.3 当刷新浏览器的时候 2.基于spring提供的类和接口刷新websocket服务器端
2.1HttpSessionHandShakeInter 握手拦截器
package com.spring;import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;import java.util.Map;/**** 握手拦截器*/
Component
Slf4j
public class MyWsInterceptor extends HttpSessionHandshakeInterceptor {Overridepublic boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, MapString, Object attributes) throws Exception {log.info(request.getRemoteAddress().toString()开始握手);return super.beforeHandshake(request, response, wsHandler, attributes);}Overridepublic void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {log.info(request.getRemoteAddress().toString()完成握手);super.afterHandshake(request, response, wsHandler, ex);}
}2.2 MyWsHandler 主处理程序
sessionbean封装类
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.web.socket.WebSocketSession;Data
AllArgsConstructor
public class SessionBean {private WebSocketSession webSocketSession;private Integer clientId;
}主处理程序
package com.spring;import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.server.Session;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.AbstractWebSocketHandler;import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;/**** webSocket 主处理程序*/
Component
Slf4j
EnableScheduling
public class MyWsHandler extends AbstractWebSocketHandler {//map有并发线程问题 所以用ConcurrentHashMapprivate static MapString, SessionBean map ;//id有并发问题 所以用Integer的安全类型private static AtomicInteger clientIdMaker;static {map new ConcurrentHashMap();clientIdMakernew AtomicInteger(0);}//连接建立Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {super.afterConnectionEstablished(session);//将session 进一步封装 id采用的是自增SessionBean sessionBean new SessionBean(session, clientIdMaker.getAndIncrement());map.put(session.getId(),sessionBean);log.info(map.get(session.getId()).getClientId()建立了连接);}//收到消息Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {super.handleTextMessage(session, message);log.info(map.get(session.getId()).getClientId():message.getPayload());}//传输异常Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {super.handleTransportError(session, exception);if (session.isOpen()){session.close();}map.remove(session.getId());}//连接关闭Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {super.afterConnectionClosed(session, status);log.info(map.get(session.getId()).getClientId()关闭连接);}/**** 向客户端发送信息*/Scheduled(fixedRate 2000)public void sendMsg() throws IOException {for (String key : map.keySet()){map.get(key).getWebSocketSession().sendMessage(new TextMessage(hello, spring socket));}}
}2.3 WebSocketConfigurer 注册拦截器和主处理程序以及监听路径
package com.spring;import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;import javax.annotation.Resource;Configuration
EnableWebSocket
public class MyWsConfig implements WebSocketConfigurer {Resourceprivate MyWsHandler wsHandler;Resourceprivate MyWsInterceptor wsInterceptor;Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(wsHandler,/myWs1).addInterceptors(wsInterceptor).setAllowedOriginPatterns(*);}
}2.4 前端测试
!DOCTYPE html
html langen
headmeta charsetUTF-8titlewsClient/title
/head
bodyscript// 创建websocketlet ws new WebSocket(ws://localhost:8080/myWs1)//向服务器发送hellows.onopenfunction (){ws.send(hello)}//监听数据ws://localhost:8080/myWsws.onmessagefunction (message){console.log(message.data)}
/script
/body
/html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/88431.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!