springboot 集成 websocket
2018-02-24 00:00
441 查看
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>springws</groupId> <artifactId>springws</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.3.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <!----- 数据库操作的相关依赖 -----> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
application.properties
server.port=8080 ######################################################## ###THYMELEAF (ThymeleafAutoConfiguration) ######################################################## #spring.thymeleaf.prefix=classpath:/templates/ #spring.thymeleaf.suffix=.html #spring.thymeleaf.mode=HTML5 #spring.thymeleaf.encoding=UTF-8 # ;charset=<encoding> is added # spring.thymeleaf.content-type=text/html # set to false for hot refresh spring.thymeleaf.cache=false debug=true ########## #spring.datasource.url=jdbc:mysql://localhost:3306/ccvms #spring.datasource.username=root #spring.datasource.password=root #spring.datasource.driver-class-name=com.mysql.jdbc.Driver #spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect #spring.jpa.hibernate.ddl-auto=none #spring.jpa.show-sql=true #spring.jackson.serialization.indent-output=true
创建 config
package com.ws.util; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; 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 org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Bean public ServerEndpointExporter serverEndpointExporter(ApplicationContext context) { return new ServerEndpointExporter(); } @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new CountWebSocketHandler(), "/web/count.do").addInterceptors(new HandshakeInterceptor()); } }
创建拦截器
package com.ws.util; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor; import java.util.Map; public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor { @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { //解决The extension [x-webkit-deflate-frame] is not supported问题 if (request.getHeaders().containsKey("Sec-WebSocket-Extensions")) { request.getHeaders().set("Sec-WebSocket-Extensions", "permessage-deflate"); } System.out.println("Before Handshake"); return super.beforeHandshake(request, response, wsHandler, attributes); } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) { System.out.println("After Handshake"); super.afterHandshake(request, response, wsHandler, ex); } }
创建处理器
package com.ws.util; 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.TextWebSocketHandler; import java.io.IOException; import java.util.*; @Component public class CountWebSocketHandler extends TextWebSocketHandler { private static Map<String,WebSocketSession> sessionMap = new HashMap<>(); @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { // session.sendMessage(new TextMessage(session.getPrincipal().getName()+",你是第" + (sessionMap.size()) + "位访客")); //p2p if(message.getPayload().equals("ping")) { sendMessage(session.getId(),"pong"+session.getId()); return; }else { //处理正常的对话 } } @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { sessionMap.put(session.getId(),session); sendMessage(session.getId(), "welcome to connect"); super.afterConnectionEstablished(session); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { sessionMap.remove(session.getId()); super.afterConnectionClosed(session, status); } /** * 发送消息 * 单发 */ public static void sendMessage(String username,String message) throws IOException { sendMessage(Arrays.asList(username),Arrays.asList(message)); } /** * * 发送消息 * 群发 */ public static void sendMessage(Collection<String> acceptorList,String message) throws IOException { sendMessage(acceptorList,Arrays.asList(message)); } /** * 发送消息,p2p 群发都支持 */ public static void sendMessage(Collection<String> acceptorList, Collection<String> msgList) throws IOException { if (acceptorList != null && msgList != null) { for (String acceptor : acceptorList) { WebSocketSession session = sessionMap.get(acceptor); if (session != null && session.isOpen() ) { for (String msg : msgList) { session.sendMessage(new TextMessage(msg.getBytes())); } } } } } /** 群发/推送 **/ public static void sendToAll() throws IOException { sendMessage(sessionMap.keySet(), " this is from web "); } }
启动类
package com.ws; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class App { public static void main(String ... args){ SpringApplication.run(App.class,args); } }
html测试
打开console查看
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> </body> <script> var url = 'ws://localhost:8080/web/count.do'; var ws = new WebSocket(url); ws.onopen = function(e) { ws.send('hello'); setInterval(function(){ ws.send('ping') },10000) }; ws.onmessage = function(e) { console.log(e.data); }; ws.onerror = function(e) { console.log(e) }; </script> </html>
服务器端推送
package com.ws.controller; import java.io.IOException; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import com.ws.util.CountWebSocketHandler; @RestController public class IndexController { @GetMapping("/push") public String index() throws IOException{ CountWebSocketHandler.sendToAll(); return "success"; } }
相关文章推荐
- spring boot 集成websocket实现实时推送
- SpringBoot集成WebSocket【基于STOMP协议】进行点对点[一对一]和广播[一对多]实时推送
- SpringBoot 集成WebSocket广播模式
- Spring-boot集成Netty做websocket服务端
- SpringBoot集成WebSocket【基于纯H5】进行点对点[一对一]和广播[一对多]实时推送
- SpringBoot Testing集成使用文档
- springboot集成quartz配置多个job任务
- Spring Boot : 集成mybatis、pagehelper插件、开启事务、druid数据源配置、mybatis-generator(十一)
- Spring boot集成Redis实现sessions共享时,sessions过期时间问题分析
- SpringBoot入门-20(springboot集成mybatis注解形式properties配置,利用@Provider实现动态SQL)
- Spring Boot集成持久化Quartz定时任务管理和界面展示
- spring boot集成tk.mybatis3.4.0通用mapper, java.lang.ClassCastException,实体不能转换为实体
- springboot项目集成Swagger2
- Spring Boot 集成 log4j2
- spring boot 集成EHCache
- spring boot & mybatis 集成 方法一
- SpringBoot集成多数据源
- spring-boot集成JPA
- SpringBoot集成分页插件PageHelper
- springboot2.0.4 集成durid加密密码