第一步: 添加Spring WebSocket的依赖jar包
打开pom.xml 先引入jar
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
<version>${spring.version}</version>
</dependency>
第二步: 创建握手类MyWebSocketInterceptor ,继承HttpSessionHandshakeInterceptor
import java.util.Map;
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;
public class MyWebSocketInterceptor extends HttpSessionHandshakeInterceptor{
@Override
public boolean beforeHandshake(ServerHttpRequest request,
ServerHttpResponse response, WebSocketHandler wsHandler,
Map<String, Object> attributes) throws Exception {
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);
}
}
第三步: 创建WebSocketConfig 路径搜索
@Configuration
@EnableWebSocket
@Component
public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer{
public static WebsocketEndPoint gameHandler =new WebsocketEndPoint();
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(gameHandler,"/appwebsocket")
.addInterceptors(new MyWebSocketInterceptor())
.setAllowedOrigins("*");
}
第四步: 创建websocket处理类
//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
private static int sum = 0;
private static final ArrayList<WebSocketSession> users = new ArrayList<WebSocketSession>();
/**
* 连接建立成功调用的方法
* */
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
System.out.println("sessionId:" + session.getId());
//连接进来的用户添加到用户集合中方便以后发送消息
users.add(session);
session.sendMessage(new TextMessage("第"+users.size()+"次进来,有点紧张!"));
session.sendMessage(new TextMessage("当前在线人数"+users.size()));
}
/**
* 关闭
*/
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
users.remove(session);
System.out.println("关闭WebSocket" + closeStatus.getReason());
}
/**
* 收到客户端消息后调用的方法
*
* @param message 客户端发送过来的消息*/
public void handleTextMessage(WebSocketSession session, TextMessage message) {
System.out.println("来自客户端的消息:" + message);
System.out.println(users.size()+"号说:"+message.getPayload()+".................");
//群发消息
for (WebSocketSession user : users) {
try {
user.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public TextMessage sendMessage(String message) throws IOException {
return new TextMessage(message);
}
最后一步:创建测试类
<!DOCTYPE HTML>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<html>
<head>
<title>My WebSocket</title>
</head>
<body>
Welcome<br/>
<input id="text1" type="text" /><button onclick="reset()">重连</button><br/>
<input id="text" type="text" /><button onclick="send()">开始发送</button>
<button onclick="closeWebSocket()">关闭连接</button>
<!--<input id="text3" type="text" /><button onclick="sendJson()">获取数据</button> -->
<div id="message">
</div>
</body>
<script type="text/javascript">
var websocket = null;
var url ="ws://localhost:8088/appwebsocket";
connectionWebSocket();
function connectionWebSocket(){
//判断当前浏览器是否支持WebSocket
if('WebSocket' in window){
websocket = new WebSocket(url);
}else if('MOzWebSocket' in window){
websocket = new MozWebSocket(url);
}else{
alert('Not support websocket')
}
//连接发生错误的回调方法
websocket.onerror = function(){
setMessageInnerHTML("error");
};
//连接成功建立的回调方法
websocket.onopen = function(event){
setMessageInnerHTML("open");
}
//接收到消息的回调方法
websocket.onmessage = function(event){
console.log(event.data);
setMessageInnerHTML(event.data);
}
//连接关闭的回调方法
websocket.onclose = function(){
setMessageInnerHTML("close");
}
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function(){
websocket.close();
}
}
//重连
function reset(){
connectionWebSocket();
}
//将消息显示在网页上
function setMessageInnerHTML(innerHTML){
document.getElementById('message').innerHTML += innerHTML + '<br/>';
}
//关闭连接
function closeWebSocket(){
websocket.close();
console.log(websocket);
}
//发送消息
function send(){
var message = document.getElementById('text').value;
websocket.send(message);
}
function sendJson(){
var message = "{'startTime':'2018-01-10 15:18:41','filedNames':'waterFrequency,pressureFeedback','deviceName':'thing'}";
websocket.send(message);
}
</script>
</html>