您的位置 首页 java

springboot快速整合websocket消息实时推送

每天分享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服务端往客户端发消息

这个时候看下刚才的客户端界面:

这个时候说明消息推送成功

文章来源:智云一二三科技

文章标题:springboot快速整合websocket消息实时推送

文章地址:https://www.zhihuclub.com/190896.shtml

关于作者: 智云科技

热门文章

网站地图