spring boot与websocket集成,实现主动推送

一、准备工作

pom.xml引入

           <dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-websocket</artifactId>

 

</dependency>

二、代码编写

创建名为WebSocketConfig的类

/**

 * 开启websocket的支持

 * @author lichao

 * @date 2018-08-28

 *

 */

@Configuration

public class WebSocketConfig {

 

@Bean

public ServerEndpointExporter serverEndpointExporter(){

return new ServerEndpointExporter();

}

 

}

 

创建名为WebSocketServer的类

@ServerEndpoint(value = "/websocket")

@Component // 此注解千万千万不要忘记,它的主要作用就是将这个监听器纳入到Spring容器中进行管理

public class WebSocketServer {

// 统计在线人数

private static int onlineCount = 0;

 

// 用本地线程保存session

private static ThreadLocal<Session> sessions = new ThreadLocal<Session>();

 

// 保存所有连接上的session

private static Map<String, Session> sessionMap = new ConcurrentHashMap<String, Session>();

 

public static synchronized int getOnlineCount() {

return onlineCount;

}

 

public static synchronized void addOnlineCount() {

onlineCount++;

}

 

public static synchronized void subOnlineCount() {

onlineCount--;

}

 

// 连接

@OnOpen

public void onOpen(Session session) {

sessions.set(session);

addOnlineCount();

sessionMap.put(session.getId(), session);

System.out.println("【" + session.getId() + "】连接上服务器======当前在线人数【" + getOnlineCount() + "】");

// 连接上后给客户端一个消息

sendMsg(session, "连接服务器成功!");

}

 

// 关闭

@OnClose

public void onClose(Session session) {

subOnlineCount();

sessionMap.remove(session.getId());

System.out.println("【" + session.getId() + "】退出了连接======当前在线人数【" + getOnlineCount() + "】");

}

 

// 接收消息 客户端发送过来的消息

@OnMessage

public void onMessage(String message, Session session) {

 

//message的格式可以包含sessionid, 格式[SID,内容XXX]:1,内容

System.out.println("【" + session.getId() + "】客户端的发送消息======内容【" + message + "】");

String[] split = message.split(",");

String sessionId = split[0];

Session ss = sessionMap.get(sessionId);

if (ss != null) {

String msgTo = "【" + session.getId() + "】发送给【您】的消息:\n【" + split[1] + "】";

String msgMe = "【我】发送消息给【" + ss.getId() + "】:\n" + split[1];

sendMsg(ss, msgTo);

sendMsg(session, msgMe);

} else {

for (Session s : sessionMap.values()) {

if (!s.getId().equals(session.getId())) {

sendMsg(s, "【" + session.getId() + "】发送给【您】的广播消息:\n【" + message + "】");

} else {

sendMsg(session, "【我】发送广播消息给大家\n" + message);

}

}

}

 

 

/*String sid = session.getId();

Session ss = sessionMap.get(sid);*/

 

}

 

// 异常

@OnError

public void onError(Session session, Throwable throwable) {

System.out.println("发生异常!");

throwable.printStackTrace();

}

 

// 统一的发送消息方法

public synchronized void sendMsg(Session session, String msg) {

try {

session.getBasicRemote().sendText(msg);

} catch (IOException e) {

e.printStackTrace();

}

}

}

 

创建前端页面

<!DOCTYPE HTML>

<html>

<head>

<title>My WebSocket</title>

</head>

 

<body>

Welcome<br/>

<input id="text" type="text" /><button οnclick="send()">Send</button>    <button οnclick="closeWebSocket()">Close</button>

<div id="message">

</div>

</body>

 

<script type="text/javascript">

    var websocket = null;

 

    //判断当前浏览器是否支持WebSocket

    if('WebSocket' in window){

        websocket = new WebSocket("ws://192.168.1.78:8080/eboata-admin/websocket");

    }

    else{

        alert('Not support websocket')

    }

 

    //连接发生错误的回调方法

    websocket.onerror = function(){

        setMessageInnerHTML("error");

    };

 

    //连接成功建立的回调方法

    websocket.onopen = function(event){

        setMessageInnerHTML("open");

    }

 

    //接收到消息的回调方法

    websocket.onmessage = function(event){

        setMessageInnerHTML(event.data);

    }

 

    //连接关闭的回调方法

    websocket.onclose = function(){

        setMessageInnerHTML("close");

    }

 

    //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。

    window.onbeforeunload = function(){

        websocket.close();

    }

 

    //将消息显示在网页上

    function setMessageInnerHTML(innerHTML){

        document.getElementById('message').innerHTML += innerHTML + '<br/>';

    }

 

    //关闭连接

    function closeWebSocket(){

        websocket.close();

    }

 

    //发送消息

    function send(){

        var message = document.getElementById('text').value;

        websocket.send(message);

    }

</script>

 

</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值