websocket实现

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);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值