websocket可以实现消息的实时推送,应用较为广泛,在工作中可以结合大数据数据的推送,后台接收并推送到前端展示,下面是我做的一个简单测试。
首先在pom.xml文件的<dependencies></dependencies>中引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket
</dependency>
创建TestWebSocketServer类:
@ServerEndpoint(value = "/websocket/test", configurator = HttpSessionConfigurator.class)
@Component
public class TestWebSocketServer extends TextWebSocketHandler {
private static final Loggerlogger = LoggerFactory.getLogger(TestWebSocketServer.class);
/**
* concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
*/
private static CopyOnWriteArraySet<TestWebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();
/**
* 与客户端的连接会话,通过该对象给客户端发送数据
*/
private Session session;
/**
* 连接建立成功调用的方法
*/
@OnOpen
public void onOpen(Session session, EndpointConfig config){
this.session = session;
webSocketSet.add(this); //加入set中
logger.info("有新窗口开始监听");
try {
sendMessage("连接成功");
}catch (IOException e) {
logger.error("websocket IO异常");
}
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose() {
// 从set中删除
webSocketSet.remove(this);
logger.info("连接关闭");
}
/**
* 收到客户端消息后调用的方法
*
* @param message 客户端发送过来的消息
*/
@OnMessage
public void onMessage(String message, Session session) {
logger.info("收到来自客户端的信息:"+message);
//群发消息
for (TestWebSocketServer item :webSocketSet) {
try {
item.sendMessage(session.getId()+":"+message);
}catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 发生错误时调用
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
logger.error("发生错误");
error.printStackTrace();
}
/**
* 向客户端发送数据
*
* @param message 数据
* @throws IOException 异常
*/
public void sendMessage(String message)throws IOException {
logger.info("消息:{}",message);
this.session.getBasicRemote().sendText(message);
}
/**
* 群发自定义消息
* @param message
* @throws IOException
*/
public void sendInfo(String message)throws IOException {
logger.info(message);
for (TestWebSocketServer item :webSocketSet) {
try {
item.sendMessage("AI:"+message);
}catch (IOException e) {
continue;
}
}
}
}
Controller类中调用TestWebSocketServer:
@Autowired
private TestWebSocketServer testWebSockeServer;
接收数据并推送:
@RequestMapping(value ="/test/infos",method = RequestMethod.POST)
public ResponseResult sendMessage(@Valid @RequestBody final TestWebsocketPojo[] testWebsocketPojos){
ResponseResult result =new ResponseResult();
try{
if(testWebsocketPojos==null || testWebsocketPojos.length==0){
result.setErrMsg("参数为空");
result.setSuccess(false);
return result;
}
for(TestWebsocketPojo pojo: testWebsocketPojos){
testWebSockeServer.sendInfo("hello,开始我们的测试");
testWebSockeServer.sendInfo(pojo.toString());
}
result.setErrMsg("传输数据成功");
result.setSuccess(true);
}catch(Exception e){
result.setErrMsg("服务出现异常"+e.getMessage());
result.setSuccess(false);
}
return result;
}
测试页面及js调用:
<!DOCTYPE html>
<html lang="en">
<meta charset="UTF-8">
<title>testWebsocket
// 初始化一个 WebSocket 对象
var ws =new WebSocket("ws://localhost:8002/websocket/test");
// 建立 web socket 连接成功触发事件
ws.onopen =function () {
// 使用 send() 方法发送数据
console.log("Socket 已打开");
ws.send("发送数据");
alert("数据发送中...");
};
// 接收服务端数据时触发事件
ws.onmessage =function (evt) {
console.log(evt.data);
var received_msg = evt.data;
alert("数据已接收...");
};
// 断开 web socket 连接成功触发事件
ws.onclose =function () {
console.log("Socket已关闭");
alert("连接已关闭...");
};
测试websocket<a href="/index.html">跳转
</html>