springboot 项目==基于websocket的服务端推送消息。

1.创建springboot项目,首先我们还是先引入依赖

<!-- webSocket  begin--><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-websocket</artifactId></dependency><!-- webSocket  end-->

2.创建配置类   WebSocketH5Config

@Configuration@EnableWebSocketpublic class WebSocketH5Config implements WebSocketConfigurer {    @Override    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {   //handler是webSocket的核心,配置入口   registry.addHandler(new MyHandler(), "/myHandler/{ID}").setAllowedOrigins("*").addInterceptors(new WebSocketInterceptor());    }

3.创建服务类   MyHandler

@Servicepublic class MyHandler implements WebSocketHandler {

    //在线用户列表    private static final Map<String, WebSocketSession> users;

    static {        users = new HashMap<>();    }

    //新增socket    @Override    public void afterConnectionEstablished(WebSocketSession session) throws Exception {        String ID = session.getUri().toString().split("ID=")[1];        //使用URLDecoder进行解码,因为前段传来的就是乱码        String decode = URLDecoder.decode(ID, "UTF-8");        System.out.println("成功建立连接,注册账号为" + decode);        if (decode != null) {            users.put(decode, session);            session.sendMessage(new TextMessage("成功建立socket连接"));            System.out.println(session);        }        System.out.println("当前在线人数:" + users.size());    }

    //接收socket信息(接受客户端的信息)    @Override    public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception {        try {            JSONObject jsonobject = JSONObject.fromObject(webSocketMessage.getPayload());//            System.out.println(jsonobject.get("id"));//            System.out.println(jsonobject.get("message") + ":来自" + (String) webSocketSession.getAttributes().get("WEBSOCKET_USERID") + "的消息");            Map map = new HashMap(2);            map.put("id", jsonobject.get("id"));            map.put("message", jsonobject.get("message").toString());            String msg = JSON.toJSONString(map);            //将消息发送到mq            Sender been = (Sender) AppContext.getBeen(Sender.class);            been.send(msg);            sendMessageToUser(jsonobject.get("id") + "", new TextMessage(msg));        } catch (Exception e) {            e.printStackTrace();        }

    }

    /**     * 发送信息给指定用户 (服务端给指定用户发送消息)     *     * @param clientId     * @param message     * @return     */    public boolean sendMessageToUser(String clientId, TextMessage message) {        if (users.get(clientId) == null) return false;        WebSocketSession session = users.get(clientId);//        System.out.println("sendMessage:" + session);        if (!session.isOpen()) return false;        try {            session.sendMessage(message);        } catch (IOException e) {            e.printStackTrace();            return false;        }        return true;    }

    /**     * 广播信息(服务端给所有用户推送消息)     *     * @param message     * @return     */    public boolean sendMessageToAllUsers(TextMessage message) {        boolean allSendSuccess = true;        Set<String> clientIds = users.keySet();        WebSocketSession session = null;        for (String clientId : clientIds) {            try {                session = users.get(clientId);                if (session.isOpen()) {                    session.sendMessage(message);                }            } catch (IOException e) {                e.printStackTrace();                allSendSuccess = false;            }        }

        return allSendSuccess;    }

    @Override    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {        if (session.isOpen()) {            session.close();        }        System.out.println("连接出错");        users.remove(getClientId(session));    }

    @Override    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {        System.out.println("连接已关闭:" + status);        users.remove(getClientId(session));    }

    @Override    public boolean supportsPartialMessages() {        return false;    }

    /**     * 获取用户标识     *     * @param session     * @return     */    private Integer getClientId(WebSocketSession session) {        try {            Integer clientId = (Integer) session.getAttributes().get("WEBSOCKET_USERID");            return clientId;        } catch (Exception e) {            return null;        }    }

    public Map<String, WebSocketSession> getAllUsers() {        return users;    }}

4.创建配置类   WebSocketInterceptor

public class WebSocketInterceptor implements HandshakeInterceptor {

    //在握手之前执行该方法, 继续握手返回true, 中断握手返回false. 通过attributes参数设置WebSocketSession的属性    @Override    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> attributes) throws Exception {        if (request instanceof ServletServerHttpRequest) {            String ID = request.getURI().toString().split("ID=")[1];            //使用URLDecoder进行解码,因为前段传来的就是乱码            String decode = URLDecoder.decode(ID, "UTF-8");            System.out.println("当前session的ID=" + decode);            //ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest) request;            //HttpSession session = serverHttpRequest.getServletRequest().getSession();            attributes.put("WEBSOCKET_USERID", decode);        }        return true;    }

    //完成握手之后执行该方法    @Override    public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) {        System.out.println("进来webSocket的afterHandshake拦截器!");    }}

5.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %><!DOCTYPE html><html><head>    <title>socket.html</title>

    <meta name="keywords" content="keyword1,keyword2,keyword3">    <meta name="description" content="this is my page">    <%--<meta name="content-type" content="text/html" charset="UTF-8">--%>    <%--<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">--%>    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

</head>

<body>

Welcome<br/>

<input id=‘ipt‘ type=‘text‘ name="注册"/><button onclick="getVal()">注册</button><br><input id="text" type="text"/><button onclick="">发送的内容</button><br><input id=‘ipts‘ type=‘text‘ name="发给谁"/><button onclick="send()">发给谁</button><button onclick="closeWebSocket()">断开连接</button>

</div><!-- 公共JS --> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script><script type="text/javascript" src="../webSocket/jquery.min.js"></script>

<script type="text/javascript">

    var websocket = null;

    function getVal() {        //创建WebSocket        connectWebSocket();    }

    //强制关闭浏览器  调用websocket.close(),进行正常关闭    window.onunload = function () {

        //关闭连接        closeWebSocket();    }

    //建立WebSocket连接    function connectWebSocket() {        var user = document.getElementById(‘ipt‘);//找到id是ipt的input节点;        var userID = user.value;        // alert(userID);        console.log("开始...");

        //建立webSocket连接        websocket = new WebSocket("ws://192.168.1.46:9999/myHandler/ID=" + userID);        // websocket = new WebSocket("ws://94.191.34.57:9999/myHandler/ID=" + userID);

        //打开webSokcet连接时,回调该函数        websocket.onopen = function () {            console.log("onpen");        }

        //关闭webSocket连接时,回调该函数        websocket.onclose = function () {            //关闭连接            console.log("onclose");        }

        //接收信息        websocket.onmessage = function (msg) {            console.log("receive msg");            console.log(msg.data);            alert(msg.data)        }    }

    //发送消息    function send() {        var user = document.getElementById(‘ipts‘);//找到id是ipt的input节点;        var userID = user.value;        // alert(userID);        var postValue = {};        postValue.id = userID;        postValue.message = $("#text").val();        websocket.send(JSON.stringify(postValue));    }

    //关闭连接    function closeWebSocket() {        if (websocket != null) {            websocket.close();        }    }</script><script type="text/javascript" charset="UTF-8"></script></body></html>

原文地址:https://www.cnblogs.com/guagua-join-1/p/10711033.html

时间: 2024-10-09 11:56:11

springboot 项目==基于websocket的服务端推送消息。的相关文章

pushlet服务端推送——点对点单播(不用修改lib包)

pushlet点对点单播,在网上看 ,大家都是将包修改然后替换lib中class,其实不用不这么麻烦,java可以继承嘛,继承原来的类重写里面的方法就行,不必编译出来替换class,这样不方便修改 新建一个类,继承nl.justobjects.pushlet.core.SessionManager类,重写里面的createSession方法即可 package com.pushlet.serveToClient; import javax.servlet.http.HttpSession; im

pushlet服务端推送

---------------------在jsp页面中加入---------------------- <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <base href=

如何使用腾讯信鸽向Android移动端推送消息(一)—如何注册Android应用

以前实现服务器端向Android移动端推送消息的功能主要借助开源的AndroidPN,但是它有一个致命的缺陷--无法向IOS终端发送消息,腾讯信鸽的出现打破了这一切,在接下来的几篇博客中将逐一地.详尽地总结一下腾讯信鸽的使用方法: 1.打开信鸽首页:http://xg.qq.com/ 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.

Html5 服务端推送 Server-Sent Event

服务器推送事件(Server-sent Events)是 HTML 5 规范中的一个组成部分,可以用来从服务端实时推送数据到浏览器端.相对于与之类似的 COMET 和 WebSocket 技术来说,服务器推送事件的使用更简单,对服务器端的改动也比较小.对于某些类型的应用来说,服务器推送事件是最佳的选择. WebSocket 在介绍 HTML 5 服务器推送事件之前,首先介绍一些上面提到的几种服务器端数据推送技术.第一种是 WebSocket.WebSocket 规范是 HTML 5 中的一个重要

转:实现一个简单的服务端推送方案

原文来自于:http://blog.csdn.net/jiao_fuyou/article/details/17090355 客户端和服务端的交互有推和拉两种方式:如果是客户端拉的话,通常就是Polling:如果是服务端推的话,一般就是Comet,目前比较流行的Comet实现方式是Long Polling. 注:如果不清楚相关名词含义,可以参考:Browser 與 Server 持續同步的作法介紹. 先来看看Polling,它其实就是我们平常所说的轮询,大致如下所示: Polling 因为服务端

Java 消息推送------GoEasy实现服务端推送和web端推送

项目中需要消息推送,又想较低开发成本,具体需求:角色用户在后台管理页面发布一个消息,所有用这个系统的用户无论在哪个页面都能及时收到他发布的消息,后来我在网上查询到了一个第三方的免费推送服务-GoEasy push, 它可以满足我的需求,下面是如何用GoEasy进行信息推送及接收: 第一种:Java服务器端推送,web端接收推送信息 步骤: 从GoEasy官网下载jar包,并放到项目中. https://cdn.goeasy.io/sdk/goeasy-0.1.jar Java代码来了,你没有看错

java SDK服务端推送 --极光推送(JPush)

网址:https://blog.csdn.net/duyusean/article/details/86581475 消息推送在APP应用中越来越普遍,来记录一下项目中用到的一种推送方式,对于Andriod它并没有自己的原生推送机制,一种简单的推送方式是采用第三方推送服务的方式,即通过嵌入SDK使用第三方提供的推送服务,主流的有百度云推送,极光推送,友盟,个推.亚马逊等等.本篇博文只介绍采用极光推送的方式.        如果你是一个新手,建议你先看完本篇博客,然后在去看官网,这样也许上手会快一

使用AJAX技术发送异步请求,HTTP服务端推送

使用AJAX技术发送异步请求 什么是AJAX AJAX指一步Javascript和XML(Asynchronous JavaScript And XML),它是一些列技术的组合,简单来说AJAX基于XMLHttpRequest让我们在不重载页面的情况下和服务器进行数据交换. 加上JavaScript和DOM(Document Object Model,文档对象模型),我们就可以在接收到响应数据后局部更新页面.XML指的是数据的交互模式,可以是纯文本(Plain Text).HTML或JSON.

其他技术---- 服务端推送SSE

SSE是Server-sent Events的简称,它是HTML5中的一种规范.目前为止那些老旧的浏览器是不直接支持SSE规范的,比如IE内核的浏览器. 我们知道websocket可以实现客户端与服务端的双向通信.SSE这个东西是可以实现服务端主动向客户端进行通信的,但是它仅仅是单向的.如果客户端与服务器端的数据交互不是特别频繁,那么我们是可以使用SSE技术来实现的. 协议 Server-sent Events主要由两部分组成. 1.服务器端与浏览器端之间的通讯协议 2.前端js对象EventS