精华内容
下载资源
问答
  • Android中实现对JPush信息的处理,后台服务器采用java开发。可以自定义要推送的信息和模式 Android中实现对JPush信息的处理,后台服务器采用java开发。可以自定义要推送的信息和模式
  • JAVA后台推送消息实现 1.什么是WebSocket WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。 2.实现原理 在实现websocket连线过程中...

    JAVA后台推送消息实现

    1.什么是WebSocket

    WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。

    2.实现原理

    在实现websocket连线过程中,需要通过浏览器发出websocket连线请求,然后服务器发出回应,这个过程通常称为“握手” 。在 WebSocket API,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

    实现步骤

    引入依赖

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

    WebSocketConfig配置类

    package com.pm.common.socket;
    
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.stereotype.Component;
    import org.springframework.web.socket.server.standard.ServerEndpointExporter;
    
    /**
     * @Auther: xzj
     * @Date: 2021/1/20
     * @Description: 配置类
     */
    @Component
    public class WebSocketConfig {
    
        /**
         * ServerEndpointExporter 作用
         *
         * 这个Bean会自动注册使用@ServerEndpoint注解声明的websocket endpoint
         *
         * @return
         */
        @Bean
        public ServerEndpointExporter serverEndpointExporter() {
            return new ServerEndpointExporter();
        }
    }
    

    *HttpSessionWSHelper

    • HttpSessionWSHelper 解决session为null 的问题 在websocket 服务类 @ServerEndpoint(value = “/websocket/{name}”,configurator = HttpSessionWSHelper.class)中使用
    /**
     * @program: HolliWDDM_S
     * @description: 获取session
     * @author: Xzj
     * @create: 2021-01-20 15:05
     **/
    package com.pm.common.socket;
    
    import javax.servlet.http.HttpSession;
    import javax.websocket.HandshakeResponse;
    import javax.websocket.server.HandshakeRequest;
    import javax.websocket.server.ServerEndpointConfig;
    
    public class HttpSessionWSHelper extends ServerEndpointConfig.Configurator {
        @Override
        public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
            System.out.println("调用modifyHandshake方法...");
            HttpSession session = (HttpSession) request.getHttpSession();//session有可能为空
            if (session!=null){
                System.out.println("获取到session id:"+session.getId());
                sec.getUserProperties().put(HttpSession.class.getName(),session);
            }else{
                System.out.println("modifyHandshake 获取到null session");
            }
        }
    }
    

    websocket 服务类

    /**
     * @program: HolliWDDM_S
     * @description:
     * @author: Xzj
     * @create: 2021-01-20 13:53
     **/
    package com.pm.service.message;
    
    import com.pm.common.socket.HttpSessionWSHelper;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Component;
    
    import javax.websocket.OnClose;
    import javax.websocket.OnMessage;
    import javax.websocket.OnOpen;
    import javax.websocket.Session;
    import javax.websocket.server.PathParam;
    import javax.websocket.server.ServerEndpoint;
    import java.util.concurrent.ConcurrentHashMap;
    
    
    /**
     * @ServerEndpoint 这个注解有什么作用?
     * <p>
     * 这个注解用于标识作用在类上,它的主要功能是把当前类标识成一个WebSocket的服务端
     * 注解的值用户客户端连接访问的URL地址
     */
    
    @Slf4j
    @Component
    // configurator = HttpSessionWSHelper.class 解决session为null
    @ServerEndpoint(value = "/websocket/{name}",configurator = HttpSessionWSHelper.class)
    public class WebSocket {
    
        /**
         * 与某个客户端的连接对话,需要通过它来给客户端发送消息
         */
        private Session session;
    
        /**
         * 标识当前连接客户端的用户名
         */
        private String name;
    
        /**
         * 用于存所有的连接服务的客户端,这个对象存储是安全的
         */
        private static ConcurrentHashMap<String, WebSocket> webSocketSet = new ConcurrentHashMap<>();
    
    
        @OnOpen
        public void OnOpen(Session session, @PathParam(value = "name") String name) {
            this.session = session;
            this.name = name;
            // name是用来表示唯一客户端,如果需要指定发送,需要指定发送通过name来区分
            webSocketSet.put(name, this);
            log.info("[WebSocket] 连接成功,当前连接人数为:={}", webSocketSet.size());
        }
    
    
        @OnClose
        public void OnClose() {
            webSocketSet.remove(this.name);
            log.info("[WebSocket] 退出成功,当前连接人数为:={}", webSocketSet.size());
        }
    
        @OnMessage
        public void OnMessage(String message) {
            log.info("[WebSocket] 收到消息:{}", message);
            //判断是否需要指定发送,具体规则自定义
            if (message.indexOf("TOUSER") == 0) {
                String name = message.substring(message.indexOf("TOUSER") + 6, message.indexOf(";"));
                AppointSending(name, message.substring(message.indexOf(";") + 1, message.length()));
            } else {
                GroupSending(message);
            }
    
        }
    
        /**
         * 群发
         *
         * @param message
         */
        public void GroupSending(String message) {
            for (String name : webSocketSet.keySet()) {
                try {
                    webSocketSet.get(name).session.getBasicRemote().sendText(message);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * 指定发送
         *
         * @param name
         * @param message
         */
        public void AppointSending(String name, String message) {
            try {
                webSocketSet.get(name).session.getBasicRemote().sendText(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        /**
         * 指定发送对象
         *
         * @param name
         * @param message
         */
        public void AppointSending(String name, Object message) {
            try {
                webSocketSet.get(name).session.getBasicRemote().sendObject(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    Java代码使用

    	// Controller
        @ApiOperation("待处理数量")
        @Scheduled(cron="0/10 * * * * ?" )//10秒执行一次
        public void getListCrhJobOrderNum() {
            try {
                crhJobOrderService.getListCrhJobOrderNum();
            } catch (Exception e) {
                log.error("待处理数量失败", e);
                e.printStackTrace();
                ResponseInfo.ofError();
            }
        }
    
    
    // servicrImpl
       @Override
        public void getListCrhJobOrderNum() {
            List<Integer> flowStates = new ArrayList<>();
            flowStates.add(FlowStepId.AUDIT_ON_JOB.code());
            flowStates.add(FlowStepId.ESTABLISH_JOB.code());
            webSocket.GroupSending(crhJobOrderMapper.getListCrhJobOrderNum(flowStates)+"");
        }
    

    WebSocket Session为null

    WebSocket Session为null

    展开全文
  • Java后台推送离线通知

    千次阅读 2019-03-15 09:41:19
    上一章节我们实现了 android使用极光推送实现单点登录,但是有些追求完美的人可能就不适用了,因为上一章节我们是通过网页方式来发送下线通知,一般情况下我们是通过后台发送离线通知的。 在此之前,没有看过...

    上一章节我们实现了  android使用极光推送实现单点登录,但是有些追求完美的人可能就不适用了,因为上一章节我们是通过网页方式来发送下线通知,一般情况下我们是通过后台发送离线通知的。

    在此之前,没有看过 Android使用极光推送实现单点登录 可以先看上一章,看完再看本章

    实现效果

    普通通知情况

     

     

    下线通知情况

    本案例采用的是最基础的Servlet来搭建的后台通知,主要是方便大家学习,不管是有基础的还是没基础的学者都可以轻松上手

    1、快捷地构建推送对象:所有平台,所有设备,内容为 ALERT 的通知

    public static PushPayload buildPushObject_all_all_alert() {
            return PushPayload.alertAll(ALERT);
        }

    2、构建推送对象:所有平台,推送目标是别名为 "alias1",通知内容为 ALERT。

    public static PushPayload buildPushObject_all_alias_alert() {
            return PushPayload.newBuilder()
                    .setPlatform(Platform.all())
                    .setAudience(Audience.alias("alias1"))
                    .setNotification(Notification.alert(ALERT))
                    .build();
        }

    3、构建推送对象:平台是 Android,目标是 tag 为 "tag1" 的设备,内容是 Android 通知 ALERT,并且标题为 TITLE。

    public static PushPayload buildPushObject_android_tag_alertWithTitle() {
            return PushPayload.newBuilder()
                    .setPlatform(Platform.android())
                    .setAudience(Audience.tag("tag1"))
                    .setNotification(Notification.android(ALERT, TITLE, null))
                    .build();
        }

    4、构建推送对象:平台是 iOS,推送目标是 "tag1", "tag_all" 的交集,推送内容同时包括通知与消息 - 通知信息是 ALERT,角标数字为 5,通知声音为 "happy",并且附加字段 from = "JPush";消息内容是 MSG_CONTENT。通知是 APNs 推送通道的,消息是 JPush 应用内消息通道的。APNs 的推送环境是“生产”(如果不显式设置的话,Library 会默认指定为开发)

    public static PushPayload buildPushObject_ios_tagAnd_alertWithExtrasAndMessage() {
            return PushPayload.newBuilder()
                    .setPlatform(Platform.ios())
                    .setAudience(Audience.tag_and("tag1", "tag_all"))
                    .setNotification(Notification.newBuilder()
                            .addPlatformNotification(IosNotification.newBuilder()
                                    .setAlert(ALERT)
                                    .setBadge(5)
                                    .setSound("happy")
                                    .addExtra("from", "JPush")
                                    .build())
                            .build())
                     .setMessage(Message.content(MSG_CONTENT))
                     .setOptions(Options.newBuilder()
                             .setApnsProduction(true)
                             .build())
                     .build();
        }

    5、构建推送对象:平台是 Andorid 与 iOS,推送目标是 ("tag1" 与 "tag2" 的并集)交("alias1" 与 "alias2" 的并集),推送内容是 - 内容为 MSG_CONTENT 的消息,并且附加字段 from = JPush。

     public static PushPayload buildPushObject_ios_audienceMore_messageWithExtras() {
            return PushPayload.newBuilder()
                    .setPlatform(Platform.android_ios())
                    .setAudience(Audience.newBuilder()
                            .addAudienceTarget(AudienceTarget.tag("tag1", "tag2"))
                            .addAudienceTarget(AudienceTarget.alias("alias1", "alias2"))
                            .build())
                    .setMessage(Message.newBuilder()
                            .setMsgContent(MSG_CONTENT)
                            .addExtra("from", "JPush")
                            .build())
                    .build();
        }

    6、构建推送对象:推送内容包含SMS信息

     public static void testSendWithSMS() {
            JPushClient jpushClient = new JPushClient(masterSecret, appKey);
            try {
                SMS sms = SMS.newBuilder()
                        .setDelayTime(1000)
                        .setTempID(2000)
                        .addPara("Test", 1)
                        .build();
                PushResult result = jpushClient.sendAndroidMessageWithAlias("Test SMS", "test sms", sms, "alias1");
                LOG.info("Got result - " + result);
            } catch (APIConnectionException e) {
                LOG.error("Connection error. Should retry later. ", e);
            } catch (APIRequestException e) {
                LOG.error("Error response from JPush server. Should review and fix it. ", e);
                LOG.info("HTTP Status: " + e.getStatus());
                LOG.info("Error Code: " + e.getErrorCode());
                LOG.info("Error Message: " + e.getErrorMessage());
            }
        }

    以上就是官方的几种推送说明。我们这里是需要使用自定义消息,所以用上面第4中,具体核心代码如下

    public static PushPayload buildPushObject_ios_tagAnd_alertWithExtrasAndMessage() {
            return PushPayload.newBuilder()
                    .setPlatform(Platform.android())
                    .setAudience(Audience.tag_and("tag1", "tag_all"))
                     .setMessage(Message.content(ALERT))
                     .setOptions(Options.newBuilder()
                             .setApnsProduction(true)
                             .build())
                     .build();
        }

    以上就是Java后台实现自定义消息推送了,感谢大家支持,最后祝大家开开心心,事业有成。

    附Demo下载地址

     

    展开全文
  • 首先获取token 获取微信token 接口 ... /** * 获取token * @param appId * @param secret * @return */ public String getWxToken(String appId,String secret){ String accessTokenU

    首先获取token

    获取微信token 接口

    https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html

    /**
     * 获取token
     * @param appId
     * @param secret
     * @return
     */
    public String getWxToken(String appId,String secret){
        String accessTokenUrl ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appId+"&secret="+secret;
        String tokenJson = WeixinUtil.httpRequest(accessTokenUrl, "GET", null);
        JSONObject jsonObject = JSONObject.parseObject(tokenJson);
        String token = jsonObject.getString("access_token");
        System.out.println("获取token -----" +  token);
        return token;
    }

     

     //   模板消息参数类

    @Data
    public class DataEntity {
    
        private String value;
        private String color;
    
        public DataEntity(String value ,String color){
            this.value = value;
            this.color = color;
        }
    
    }

     // http 请求微信服务器发送消息

     public static String doGetPost(String apiPath, String type, Map<String,Object> paramMap){
    
            OutputStreamWriter out = null;
            InputStream is = null;
            String result = null;
            try{
                URL url = new URL(apiPath);// 创建连接
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setDoOutput(true);
                connection.setDoInput(true);
                connection.setUseCaches(false);
                connection.setInstanceFollowRedirects(true);
                connection.setRequestMethod(type) ; // 设置请求方式
                connection.setRequestProperty("Accept", "application/json"); // 设置接收数据的格式
                connection.setRequestProperty("Content-Type", "application/json"); // 设置发送数据的格式
                connection.connect();
    
                if(type.equals("POST")){
                    out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); // utf-8编码
                    out.append(JSON.toJSONString(paramMap));
                    out.flush();
                    out.close();
                }
    
    
                // 读取响应
                is = connection.getInputStream();
                int length = (int) connection.getContentLength();// 获取长度
                if (length != -1) {
                    byte[] data = new byte[length];
                    byte[] temp = new byte[512];
                    int readLen = 0;
                    int destPos = 0;
                    while ((readLen = is.read(temp)) > 0) {
                        System.arraycopy(temp, 0, data, destPos, readLen);
                        destPos += readLen;
                    }
                    result = new String(data, "UTF-8"); // utf-8编码
    
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return  result;
        }

     // openid: 为你要发送给哪个用户的openid   

    发送模板消息接口

    public void sendTemplateMessage(String openid,String accessToken ) {
            String templateUrl= "模板消息跳转地址";
            String  templateId = "微信公众号的模板id";
            String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;
            //整体参数map
            Map<String, Object> paramMap = new HashMap<String, Object>();
            //消息主题显示相关map
            Map<String, Object> dataMap = new HashMap<String, Object>();
    
            dataMap.put("keyword1",new DataEntity(keyword1),"#173177"));
            dataMap.put("keyword2",new DataEntity(keyword2),"#173177"));
            dataMap.put("keyword3",new DataEntity(keyword3),"#173177"));
            dataMap.put("keyword4",new DataEntity(keyword4),"#173177"));
            dataMap.put("keyword5",new DataEntity(keyword5),"#173177"));
    
            paramMap.put("touser", openid);
            paramMap.put("template_id", templateUrl);
            paramMap.put("url", url);
            paramMap.put("data", dataMap);
            String msgJson = RequestClass.doGetPost(url, "POST", paramMap);
            System.out.println("微信推送消息响应:--------" +msgJson);
          //  Map<String,TemplateData> m = new HashMap<String,TemplateData>();
        }

    这样就推送成功拉。 

     

    记录一下。 

     

    展开全文
  • 2,。Java对接需要依赖包 <dependency> <groupId>cn.jpush.api</groupId> <artifactId>jpush-client</artifactId> <version>3.3.8</version></d...

    1.极光对接,首先需要注册用户,和创建应用

    2,。Java对接需要依赖包

    <dependency>
    <groupId>cn.jpush.api</groupId>
    <artifactId>jpush-client</artifactId>
    <version>3.3.8</version>
    </dependency>

    3,对所有的ios和Android开发者推送

    package com.qualityshop.jiguang;
    
    import cn.jpush.api.JPushClient;
    import cn.jpush.api.push.PushResult;
    import cn.jpush.api.push.model.Message;
    import cn.jpush.api.push.model.Platform;
    import cn.jpush.api.push.model.PushPayload;
    import cn.jpush.api.push.model.audience.Audience;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * 极光推送
     *
     * @author huojg
     */
    public class Jdpush {
        private static final Logger logger = LoggerFactory.getLogger(Jdpush.class);
        public static final String APPKEY = "*******";
        public static final String MASTERSECRET = "******";
        public static JPushClient jpushClient = null;
    
        public static void sendPush(String title,String msg) {
            JPushClient jpushClient = new JPushClient(MASTERSECRET, APPKEY);
            PushPayload payload = buildPushObjectByMessage(title,msg);
            try {
                PushResult result = jpushClient.sendPush(payload);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static PushPayload buildPushObjectByMessage(String title,String msg) {
            return PushPayload.newBuilder().setPlatform(Platform.all())// 设置接受的平台
                    .setAudience(Audience.all())// Audience设置为all,说明采用广播方式推送,所有用户都可以接收到
                    .setMessage(Message.newBuilder()
                            .setTitle(title)
                            .setMsgContent(msg)
                            .build())
                    .build();
        }
    }

     

     

    4就会在app开发者收到信息。

     

    转载于:https://www.cnblogs.com/huojg-21442/p/9818544.html

    展开全文
  • 每个程序猿(媛)都有过...最近在看关于实时消息推送方面的技术文章,然后发现了一篇值得欣慰的文章,欣慰的原因是,文章里讲解如何用Java进行消息推送访问者可以一眼就看出实现思路,大家可以进去瞅一眼,这是博客网址...
  • 开发人员联系方式:251746034@qq.com 代码库:https://github.com/chenjia/lxt 里面的lxt-push模块 示例:http://47.100.119.102/vue-desktop 二维码登录/聊天室...目的:使用http长链接实现后台推送功能 ##风飞舞 ...
  • 场景:导入案件的时候,由于导入数据量...这里要写个真的问题:导入案件的后台操作比较复杂,没有想出在方法执行完毕之前去前台返回各个状态的值,方法里包含excel数据的校验和一条数据要分别导入4张表中的问题。所...
  • Background 网上此类相关教程有很多哈,但是,都不能直接拿来用,还需要自己拿过来封装调试下,这里是参考别人的实现自己的过程,做下记录,方便以后查阅: 1、建立一个钉钉群 人数要大于等于三人(不然还群聊个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 684
精华内容 273
关键字:

java后台推送

java 订阅