WebSocket的简单使用, 找了个教程做了一下, 发现还是挺有意思的. 这里就直接记录下来怎么折腾的:
首先需要配置开启WebSocket:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
有了ServerEndpointExporter的支持, 就能够在控制器中开启WebSocket, 然后配置对应的注解与路径, 就可以将那个路径变成WebSocket协议:
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Controller
@ServerEndpoint("/test")
public class WebSocketServer {
private static Map<String, Session> clients = new ConcurrentHashMap<>();
@OnOpen
public void onOpen(Session session) {
System.out.println("有新客户端连接: " + session.getId());
clients.put(session.getId(), session);
}
@OnClose
public void onClose(Session session) {
System.out.println("有用户断开了, id为:" + session.getId());
clients.remove(session.getId());
}
@OnError
public void onError(Throwable throwable) {
throwable.printStackTrace();
}
@OnMessage
public void onMessage(String message) {
System.out.println("接收到的Message是: " + message);
this.sendAll(message);
}
private void sendAll(String message) {
for (Map.Entry<String, Session> sessionEntry : clients.entrySet()) {
sessionEntry.getValue().getAsyncRemote().sendText(message);
}
}
}
这段代码也比较清楚, 就是每来一个新连接, 就把连接号和对应的连接对象放到一个Map中, 之后群发消息的时候遍历这个对象然后进行发送.
之后是前端:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>TITLE</title>
<style>
.message {
border: 1px solid black;
width: 300px;
height: 200px;
}
</style>
</head>
<body>
<input type="text" class="message" id="message">
<div class="message" id="result">
</div>
<button id="send">button</button>
<script type="text/javascript">
var start = false;
var url = "ws://localhost:8080/test";
var sock = new WebSocket(url);
sock.onopen = function () {
console.log("开启连接");
sayHello();
};
sock.onmessage = function (e) {
console.log("接受消息" + e.data);
if (start) {
document.getElementById("result").innerHTML = (new Date() + "<br>" + e.data);
}
start = true;
};
sock.onclose = function () {
console.log("关闭连接")
};
function sayHello() {
var text = document.getElementById("message").value;
document.getElementById("message").value = "";
console.log("发送消息" + text);
sock.send(text);
}
document.getElementById("send").addEventListener("click", sayHello);
</script>
</body>
</html>
这里用了一个框输入消息, 一个框展示接收到的消息, 原理都很简单. 没有想到WebSocket如此简单好用. 以后可以尝试在Web中使用一下WebSocket了.
基本上Spring 4.x 的内容都看完了, 这次主要是从原理角度重新过了一遍, 框架其实就是一本说明书很厚的工具, 知道如何在框架的内部把框架的流程替换成自己的就可以了.
下一步就是再次回到数据结构和算法上来了, 估计要用C语言和Java同时来操作一下了. 先从Java的数据结构好好学起吧.