1、websocket简介
1.1、WebSocket 是什么?
WebSocket 是一种网络通信协议。RFC6455 定义了它的通信标准。
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
1.2、为什么需要WebSocket?
HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。
这种通信模型有一个弊端:HTTP 协议无法实现服务器主动向客户端发起消息。
这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。大多数 Web 应用程序将通过频繁的异步JavaScript和XML(AJAX)请求实现长轮询。轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。
WebSocket 就是这样发明的。WebSocket 连接允许客户端和服务器之间进行全双工通信,以便任一方都可以通过建立的连接将数据推送到另一端。WebSocket 只需要建立一次连接,就可以一直保持连接状态。这相比于轮询方式的不停建立连接显然效率要大大提高。
2、构建工程
2.1、在pom中添加websocket的依赖
org.springframework.boot
spring-boot-starter-websocket
2.2、创建请求消息实体
package com.vesus.springbootwebsocket.model;
/**
* @Description:
* @Author: vesus
* @CreateDate: 2018/5/28 下午5:46
* @Version: 1.0
*/
public class RequestMessage {
/***
* 请求消息
*/
private String message ;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2.3、创建响应消息实体
package com.vesus.springbootwebsocket.model;
/**
* @Description:
* @Author: vesus
* @CreateDate: 2018/5/28 下午5:47
* @Version: 1.0
*/
public class ResponseMessage {
/**
* 响应消息
*/
private String message ;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2.4、配置消息代理
package com.vesus.springbootwebsocket.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
/**
* @Description:
* @Author: vesus
* @CreateDate: 2018/5/29 上午10:41
* @Version: 1.0
*/
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
/***
* 注册 Stomp的端点
* addEndpoint:添加STOMP协议的端点。提供WebSocket或SockJS客户端访问的地址
* withSockJS:使用SockJS协议
* @param registry
*/
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/api/v1/socket")
.setAllowedOrigins("*")//添加允许跨域访问
.withSockJS() ;
}
/**
* 配置消息代理
* 启动Broker,消息的发送的地址符合配置的前缀来的消息才发送到这个broker
*/
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/api/v1/socket/send");//推送消息前缀
registry.setApplicationDestinationPrefixes("/api/v1/socket/req");//应用请求前缀
registry.setUserDestinationPrefix("/user");//推送用户前缀
}
}
2.5、控制器
package com.vesus.springbootwebsocket.controller;
import com.vesus.springbootwebsocket.model.RequestMessage;
import com.vesus.springbootwebsocket.model.ResponseMessage;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.annotation.Resource;
/**
* @Description:
* @Author: vesus
* @CreateDate: 2018/5/29 下午1:48
* @Version: 1.0
*/
@Controller
public class WebSocketController {
@Resource
private SimpMessagingTemplate messagingTemplate ;
@RequestMapping("/index")
public String index(){
return "index";
}
@MessageMapping("/welcome")
public ResponseMessage toTopic(RequestMessage msg) throws Exception
{
System.out.println("======================"+msg.getMessage());
this.messagingTemplate.convertAndSend("/api/v1/socket/send",msg.getMessage());
return new ResponseMessage("欢迎使用webScoket:"+msg.getMessage());
}
@MessageMapping("/message")
public ResponseMessage toUser(RequestMessage msg ) {
System.out.println(msg.getMessage());
this.messagingTemplate.convertAndSendToUser("123","/message",msg.getMessage());
return new ResponseMessage("欢迎使用webScoket:"+msg.getMessage());
}
}
2.6、前端html
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
WebScoket广播式
输入名称:
源码:https://gitee.com/vesus198/springboot-demo/tree/master/springboot-websocket