每天分享java小知识 干货,欢迎关注转发评论,每天一点进步!
场景:websoket消息的实时推送
- pom.xml
<!– websocket –>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
W eb socket Config.java
package com.junsi.demo.websocket; import org.springframework.context. annotation .Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configurat io n public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
WebSocketServer.java
package com.junsi.demo.websocket;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.On message ;
import javax.websocket.OnOpen;
import javax.websocket. session ;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import org. slf4j . log ger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype. Component ;
@ServerEndpoint(value = “/websocketServer”)
@Component(“web Socket Server”)
public class WebSocketServer {
//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
private static int onlineCount = 0;
//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();
//与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;
private static Logger log = LoggerFactory.getLogger(WebSocketServer.class);
/**
* 连接建立成功调用的方法*/
@OnOpen
public void onOpen(Session session) {
this.session = session;
webSocketSet.add(this); //加入set中
addOnlineCount(); //在线数加1
log.info(“有新连接加入!当前在线人数为” + getOnlineCount());
try {
sendMessage (“连接成功”);
} catch (IOException e) {
log.error(“websocket IO异常”);
}
}
//连接打开时执行
@OnOpen
public void onOpen(@PathParam(“user”) String user, Session session) {
//currentUser = user;
System.out.println(“Connected … ” + session.getId());
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose() {
webSocketSet.remove(this); //从set中删除
subOnlineCount(); //在线数减1
log.info(“有一连接关闭!当前在线人数为” + getOnlineCount());
}
/**
* 收到客户端消息后调用的方法
*
* @param message 客户端发送过来的消息*/
@OnMessage
public void onMessage(String message, Session session) {
log.info(“来自客户端的消息:” + message);
//群发消息
for (WebSocketServer item : webSocketSet) {
try {
item.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
log.error(“发生错误”);
error.printStackTrace();
}
public void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
}
/**
* 群发自定义消息
* */
public static void sendInfo(String message) throws IOException {
log.info(message);
for (WebSocketServer item : webSocketSet) {
try {
item.sendMessage(message);
} catch (IOException e) {
continue;
}
}
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
WebSocketServer.onlineCount++;
}
public static synchronized void subOnlineCount() {
WebSocketServer.onlineCount–;
}
}
- websokect.html(websockect客户端界面)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
<script src="jquery.min.js"></script>
<script>
var socket;
if (typeof (WebSocket) == "undefined") {
console.log("您的浏览器不支持WebSocket");
} else {
console.log("您的浏览器支持WebSocket");
//实现化WebSocket对象,指定要连接的服务器地址与端口 建立连接
socket = new WebSocket("ws://localhost:9090/demo/websocketServer");
//打开事件
socket.onopen = function () {
console.log("Socket 已打开");
//socket.send("这是来自客户端的消息" + location.href + new Date());
};
//获得消息事件
socket.onmessage = function(msg) {
console.log(msg.data);
//发现消息进入 调后台获取
$("#websocket").html(msg.data)
};
//关闭事件
socket.onclose = function() {
console.log("Socket已关闭");
};
//发生了错误事件
socket.onerror = function() {
alert("Socket发生了错误");
}
$(window).unload(function() {
socket.close();
});
}
</script>
</head>
<body>Hello websocket!!!.
<div id="websocket">
</div>
</body>
</html>
- WbSocketController.java(测试用的)
package com.junsi.demo.controller;
import java.io.IOException;
import org.springframework.web. bind .annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import com.junsi.demo.json.AjaxJson;
import com.junsi.demo.websocket.WebSocketServer;
@RestController
@RequestMapping
public class WebsocketController {
@GetMapping("/websocketView")
public ModelAndView websocketView() {
ModelAndView model = new ModelAndView();
model.setViewName("/view/websocket"); //你要跳转html的名字
return model;
}
@GetMapping("/websocketSend")
public AjaxJson websocketSend() {
AjaxJson ajaxJson= new AjaxJson();
try {
WebSocketServer.sendInfo("send message");
} catch (IOException e) {
ajaxJson.setError("500", "服务器异常");
return ajaxJson;
}
ajaxJson.setSuccess(true);
ajaxJson.setData("发送消息");
return ajaxJson;
}
}
- 先将客户端界面打开 如下图所示:
- 另外开一个浏览器: 模拟websocket服务端往客户端发消息
这个时候看下刚才的客户端界面:
这个时候说明消息推送成功