websocket是实现长连接的一种手段,通过websocket可以实现页面数据的实时刷新,下面是一个简单的例子:
一、JS的书写
function loadAlarmRelate(){
//判断当前浏览器是否支持websocket
if('WebSocket' in window){
var websocket = new WebSocket("ws://127.0.0.1:8080/ndi2.0/screenTopFresh");
//连接发生错误的时候
websocket.onerror = function (){
console.log("WebSocket连接发生错误");
}
//当连接成功的时候
websocket.onopen = function (){
websocket.send("Hello WebSockets!");
}
//接受到消息的时候
websocket.onmessage = function (event){
console.log(event.data);
}
//关闭连接的时候
websocket.onclose = function (){
console.log("WebSocket连接关闭");
}
离开页面时的其他操作
window.onbeforeunload = function (){
websocket.close();
}
}else {
console.log('当前浏览器 Not support websocket')
}
}
二、java代码的书写
需要导入包:javax.websocket-api-1.0.jar
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;
import com.app.frame.base.controller.BaseController;
import com.staryea.main.screenData.ScreenDataService;
@Controller
@RequestMapping("/websocketHandler")
@ServerEndpoint("/screenTopFresh")
public class WebSocketScreenDataTest extends BaseController {
// 当前保持连接数
private static int collectOnlineCount = 0;
private Session session;
// 当前连接集合
private static CopyOnWriteArraySet<WebSocketScreenDataTest> collectOnlineSet = new CopyOnWriteArraySet<WebSocketScreenDataTest>();
private static Logger logger = LoggerFactory.getLogger(WebSocketScreenDataTest.class);
// 当前连接计数器加一
public static synchronized void addOnlineCount() {
WebSocketScreenDataTest.collectOnlineCount++;
}
// 获取当前连接数
public static synchronized int getOnlineCount() {
return WebSocketScreenDataTest.collectOnlineCount;
}
// 当前连接计数器减一
public static synchronized void subOnlineCount() {
WebSocketScreenDataTest.collectOnlineCount--;
}
/**
* 当关闭时候的处理
*/
@OnClose
public void onClose() {
collectOnlineSet.remove(this);
subOnlineCount();
logger.info("有一个连接关闭,当前alarmCollect-websocket连接数为:{}", getOnlineCount());
}
/**
* 当发生错误时候的处理
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
logger.info("连接发生错误");
error.printStackTrace();
}
/**
* 收到消息
*
* @param message
*/
@OnMessage
public void onMessage(String message) {
logger.debug("收到消息:" + message);
for (WebSocketScreenDataTest item : collectOnlineSet) {
try {
//循环给每个链接发送数据
item.sendMessage(message);
} catch (Exception e) {
e.printStackTrace();
continue;
}
}
}
/**
* 当有请求连接
*/
@OnOpen
public void onOpen(Session session) {
this.session = session;
collectOnlineSet.add(this);
addOnlineCount();
logger.info("有页面接入,当前alarmCollect-websocket连接数:{}", getOnlineCount());
}
/**
* 向各个连接推送消息
*
* @param message
* @throws IOException
*/
public void sendMessage(String message) throws IOException {
session.getBasicRemote().sendText(message);
}
}