服务器主动向客户端发送信息机制


常见的服务器主动向客户端发送信息的机制有:
1 轮询:
客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
优点:后端程序编写比较容易。
缺点:请求中有大半是无用,浪费带宽和服务器资源。
长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。优点:在无消息的情况下不会频繁的请求。缺点:服务器hold连接会消耗资源。实例:WebQQ、Hi网页版、Facebook IM。


2长连接:
长连接(Long-Polling)的服务其客户端是不做轮询的,客户端在发起一次请求后立即挂起,一直到服务器端有更新的时候,服务器才会主动推送信息到客户端。 在服务器端有更新并推送信息过来之前这个周期内,客户端不会有新的多余的请求发生,服务器端对此客户端也啥都不用干,只保留最基本的连接信息,一旦服务器有更新将推送给客户端,客户端将相应的做出处理,处理完后再重新发起下一轮请求。
设置心跳包,对于特定的服务端与客户端来说也需要一定时间间隔的心跳,告诉服务器我还活着,虽然我没干活,也没说话,但是别把我给关了


3 推送:
其实也是长连接的形式
但是长连接的编写比较复杂, 心跳包的设置也根据不同的网络环境有关,并且现在的多平台传输会让服务器与多个平台建立多个长连接,比较耗费资源
因此 推送形式可以较好的解决以上问题


系统级的推送产品:Android上有GCM,iOS上有APNS,WinPhone有MPNS。
第三方也有信鸽,极光, 个推等第三方推送平台


这里介绍两个第三方推送平台

个推平台


该平台可以发送普通的通知栏消息,也可以发送透传消息,还有电子围栏(根据用户的地理位置传推送),以及通过点击消息栏的信息去启动软件或者打开连接,还可以对不同用户分类发送,等等多项功能
android-studio开发根据这个文档:
http://docs.getui.com/mobile/android/androidstudio_maven/
可以很简单的快速的建立起推送


具体的建立流程参考上述的网址,按照网站提示的按步骤操作。


在这里补充一些内容

CID(clientid)是什么
标识每个用户的一个连接ID
可以在Activity创建时或者某些事件时, 建立连接 。然后,发送一个网络请求,将该CID给服务器 并且加上其他标识信息,让服务器可以对该CID进行归类,以便后面用来推送消息给不同的目标用户。
怎么获取CID
1 继承GTIntentService的类中有重写方法onReceiveClientId可以获取
2 也可以 clientID=PushManager.getInstance().getClientid(MapActivity.this);


透传消息怎么获取
继承GTIntentService的类中有重写方法onReceiveMessageData是用于获取透明消息的方法
如果是用推送消息的高级设置,传递透传消息,则要点击了推送体
才会调用该方法
也可以只传透传消息
然后不需要任何操作就能去获得这个透传消息

//可以获取各种信息 如appid taskid messageid PkgName cidString appid = msg.getAppid();String taskid = msg.getTaskId();String messageid = msg.getMessageId();String pkg = msg.getPkgName();String cid = msg.getClientId();//还有传过来的透传消息的内容byte[] payload = msg.getPayload();if(payload==null){Log.e(TAG, "receiver payload = null");}else{String data = new String(payload);Log.d(TAG, "receiver payload = " + data);try {// 在这里去通知APP执行相应操作} catch (Exception e) {e.printStackTrace();}}

遇到的问题:
1 添加SDK的时候,会自动帮你配置一些权限 如果你有这些权限 (如别的功能在Manifest中说明了这个权限)
会报错

Error:Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed with multiple errors, see logs

解决:删去重复的权限


2 gradle同步的时候,还可能会说一些 key的错误
解决:就接着按着他的步骤往下配置 后面自然会有key的配置


3 在Activity的Oncreate中直接初始化sdk,没网的时候会直接强退
解决:要加判断才进行连接


4 关了程序 弹不出推送消息并且推送消息的高级设置的透传也不能获取 要打开那个Activity(初始化获取的Service的Activity)才行
现在做的项目暂时没用到,先放着,待填~


极光推送平台参考:
http://blog.csdn.net/weixin_37577039/article/details/79423578

服务器主动向客户端发送信息机制相关推荐

  1. Django使用Channels主动给客户端发送信息

    最近做的Django项目中有一条需求是当用户写完邮件并选择抄送用户,用户发送邮件后,服务器主动会给在所有抄送用户发送一条提示.这里可以使用支持WebSoket协议的Channels. 思路简述: 用户 ...

  2. ssm配置socket_ssm框架中集成websocket实现服务端主动向客户端发送消息

    找了很多配置文档及实例说明,也还是没能成功,最终在csdn博客中发现了基于stomp的消息推送的文章, 下面整理自csdn博客,https://blog.csdn.net/u013627689/art ...

  3. C# SuperSocket 手把手教你入门 傻瓜教程---1(服务器单向接收客户端发送数据)

    C# SuperSocket 手把手教你入门 傻瓜教程系列教程 C# SuperSocket 手把手教你入门 傻瓜教程---1(服务器单向接收客户端发送数据) C# SuperSocket 手把手教你 ...

  4. 云服务器怎么给客户端发送消息,服务器怎样向客户端发送消息

    服务器怎样向客户端发送消息 内容精选 换一换 使用SSH方式登录CentOS 6.5操作系统的弹性云服务器时,过一段时间就会自动断开连接.本节操作介绍如何保持SSH会话持续连接不断开该文档适用于Cen ...

  5. 服务器怎么向指定客户端发送信息,WebSocket 如何实现服务端向客户端发送消息?...

    我们都知道, Websocket 是一个双向的通讯方式,一般情况下,我们都是根据 Client 的情况返回信息,但是在一个更加健壮的系统,我们可能需要主动的向客户端发送消息.我试图在中文网络去搜索,查 ...

  6. Android的SocketTCP客户端发送信息

    通过Android Studio建立SocketTCP客户端发送字符串 上回书说到,STM32通过Socket建立TCP服务器之后可以通过TCP客户端来给它发出指令,但是电脑发指令就比较麻烦,所以花了 ...

  7. java监听某端口和ip_Java 通过Socket监听指定服务器(IP)的指定端口,及向指定服务器的指定端口发送信息...

    客户端:向指定端口发送信息 package com.jszc.lottery.modules.longpay.util; import java.io.BufferedReader; import j ...

  8. 服务器如何保存客户端登录信息吗,登录信息处理方法、客户端、服务器及存储介质...

    1. 一种登录信息处理方法,其特征在于,所述登录信息处理方法包括以下步骤: 客户端获取用户的访问请求: 提取所述访问请求中目标页面的预设域名信息,从所述预设域名信息中查找登陆密 钥,并向服务器发送所述 ...

  9. netty 服务端主动向客户端发信息

    在使用netty时,有时候会和客户端保持长链接,这个时候服务端既可以接受客户端消息也可以主动发送消息给服务端.我们只需要在服务端保存客户端的ChannelHandlerContext对象,必要的时候通 ...

  10. 服务器发送二进制文件大小,如何从dotnet核心服务器向SignalR客户端发送二进制文件...

    我们有一个使用.Net向SignalR客户端发送文件的解决方案我们现在已移至 .Net Core 在以前的.net解决方案中,我们通过 GlobalHost.ConnectionManager 使用H ...

最新文章

  1. AI 与小学生的做题之战,孰胜孰败?
  2. Class类是什么? Class.forName()是干什么的?
  3. 【freemaker】之include,import区别
  4. 丑憨批的爬虫笔记4BeautifulSoup4
  5. 计算机桌面堆,桌面堆 Desktop heap设置
  6. HTTP详解(转载)
  7. .NET 5.0正式发布,有什么功能特性(翻译)
  8. 数列分块入门 8(LibreOj-6284)
  9. 坚持的力量 第十一篇
  10. 前端项目集成 stylelint
  11. scala特性_Scala特性示例教程
  12. 前端基础 IE浏览器渲染-重置浏览器默认样式
  13. 四、ARDUINO UNO开发板介绍
  14. 数字货币期货生存指南
  15. 使用Selenium爬取淘宝商品
  16. Idea设置全白色 背景
  17. AWFWD改进后的融合算法
  18. 无人驾驶小车调试笔记(五)-- 命令行通信
  19. Thunderbolt4,雷电4与USB4
  20. 关于Johnson-Trotter和字典序排列在《算法设计与分析基础》中的论述

热门文章

  1. 【DM642】ICELL Interface—Cells as Algorithm Containers
  2. STM32F103C8T6开发环境的搭建
  3. 安全基础:0-day漏洞
  4. matlab实现将彩色图像转换成灰色图像的方法
  5. 于朦胧 机器人_机器人演戏?建议于朦胧陈钰琪这部《两世欢》改名:我的面瘫男友...
  6. 为mandriva 2010 spring打包(geany-0.19.2)
  7. iPhone所有手机型号屏幕尺寸及H5的CSS适配
  8. win7计算机默认用户名,win7系统任务管理器中用户名没有显示的解决方法
  9. Liskov Substitution Principle
  10. unipus iTEST考试助手---写脚本与反脚本的拉锯战