精华内容
下载资源
问答
  • 服务器主动客户端发送信息机制

    万次阅读 2017-12-18 21:00:14
    服务器主动客户端发送信息机制 常见的服务器主动客户端发送信息的机制有: 1 轮询: 客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。 优点:后端程序编写比较容易。 缺点...

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


    常见的服务器主动向客户端发送信息的机制有:
    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 cid
     String 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

    展开全文
  • 使用.NET Remoting从服务器主动发出事件通知客户端(远程广播) 经常看见有人问:使用.NET Remoting如何从服务器主动发出事件通知客户端?的确,初接触.NET Remoting的人多半会有这样的疑问,因为大部分的文章和...
  • //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。 window.onbeforeunload = function() { websocket.close(); } //将消息显示在网页上 ...

    服务端

    @Configuration
    public class WebSocketConfig {
    	@Bean
    	public ServerEndpointExporter serverEndpointExporter(){
    		return new ServerEndpointExporter();
    	}
    }
    
    @ServerEndpoint("/websocket")
    @Component
    public class WebSocketTest {
    
    	private static int onlineCount = 0;
    
    	private static CopyOnWriteArraySet<WebSocketTest> webSocketSet = new CopyOnWriteArraySet<>();
    
    	private Session session;
    
    	@OnOpen
    	public void onOpen(Session session) {
    		this.session = session;
    		webSocketSet.add(this);
    		addOnlineCount();
    		System.out.println("有新链接加入!当前在线人数为" + getOnlineCount());
    	}
    
    	@OnClose
    	public void onClose() {
    		webSocketSet.remove(this);
    		subOnlineCount();
    		System.out.println("有一链接关闭!当前在线人数为" + getOnlineCount());
    	}
    
    	@OnMessage
    	public void onMessage(String message, Session session) throws IOException {
    		System.out.println("来自客户端的消息:" + message);
    		// 群发消息
    		for (WebSocketTest item : webSocketSet) {
    			item.sendMessage(message);
    			item.sendMessage(message);
    			item.sendMessage(message);
    		}
    	}
    
    	public void sendMessage(String message) throws IOException {
    		this.session.getBasicRemote().sendText(message);
    	}
    
    	public static synchronized int getOnlineCount() {
    		return WebSocketTest.onlineCount;
    	}
    
    	public static synchronized void addOnlineCount() {
    		WebSocketTest.onlineCount++;
    	}
    
    	public static synchronized void subOnlineCount() {
    		WebSocketTest.onlineCount--;
    	}
    
    }


    客户端


    <!DOCTYPE HTML>
    <html>
    <head>
    <base href="localhost://localhost:8080/">
    <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://localhost:8084/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>
    






    展开全文
  • 一、消息推送基础消息推送,就是在互联网上通过定期传送用户需要的信息来减少信息过载的一项新技术。推送技术通过自动传送信息给用户,来减少用于网络上搜索的时间。...一般情况下,客户端服务器之间通讯客户端是主

    一、消息推送基础

    消息推送,就是在互联网上通过定期传送用户需要的信息来减少信息过载的一项新技术。推送技术通过自动传送信息给用户,来减少用于网络上搜索的时间。它根据用户的兴趣来搜索、过滤信息,并将其定期推给用户,帮助用户高效率地发掘有价值的信息。

    当我们开发需要和服务器交互的移动应用时,基本上都需要和服务器进行交互,包括上传数据到服务器,同时从服务器上获取数据。

    一般情况下,客户端与服务器之间通讯客户端是主动的,但这就存在一个问题就是一旦服务器数据有更新或者服务器要下发通知给客户端只能等客户端连接的时候才能实现。这种方式使消息失去了实时性。

    如何使客户端能够实时的收到服务器的消息和通知,总体来说有两种方式,第一种是客户端使用Pull(拉)的方式,就是隔一段时间就去服务器上获取一下信息,看是否有更新的信息出现。第二种就是服务器使用Push(推送)的方式,当服务器端有新信息了,则把最新的信息Push到客户端上。这样,客户端就能自动的接收到消息。 

    虽然Pull和Push两种方式都能实现获取服务器端更新信息的功能,但是明显来说Push方式比Pull方式更优越。因为Pull方式更费客户端的网络流量,更主要的是费电量,还需要我们的程序不停地去监测服务端的变化。  

    二、几种常见的解决方案实现原理

    1)轮询(Pull)方式:客户端定时向服务器发送询问消息,一旦服务器有变化则立即同步消息。

    2)SMS(Push)方式:通过拦截SMS消息并且解析消息内容来了解服务器的命令,但这种方式一般用户在经济上很难承受。

    3)持久连接(Push)方式:客户端和服务器之间建立长久连接,这样就可以实现消息的及时行和实时性。

    三、消息推送解决方案概述

    A、C2DM云端推送方案

    在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务。Android Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。

    该方案存在的主要问题是C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用。

    B、MQTT协议实现Android推送

    采用MQTT协议实现Android推送功能也是一种解决方案。MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。
    wmqtt.jar 是IBM提供的MQTT协议的实现。我们可以从这里(https://github.com/tokudu/AndroidPushNotificationsDemo)下载该项目的实例代码,并且可以找到一个采用PHP书写的服务器端实现(https://github.com/tokudu/PhpMQTTClient)。

    C、RSMB实现推送功能

    Really Small Message Broker (RSMB) ,是一个简单的MQTT代理,同样由IBM提供,其查看地址是:http://www.alphaworks.ibm.com/tech/rsmb。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。SAM是一个针对MQTT写的PHP库。我们可以从这个http://pecl.php.net/package/sam/download/0.2.0地址下载它。

    D、XMPP协议实现Android推送

    Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。
    androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。但也存在一些不足之处:
    1) 比如时间过长时,就再也收不到推送的信息了。
    2)性能上也不够稳定。
    3)如果将消息从服务器上推送出去,就不再管理了,不管消息是否成功到达客户端手机上。
    如果我们要使用androidpn,则还需要做大量的工作,需要理解XMPP协议、理解Androidpn的实现机制,需要调试内部存在的BUG。

    E、使用第三方平台

    目前国内、国外有一些推送平台可供使用,但是涉及到收费问题、保密问题、服务质量问题、扩展问题等等,又不得不是我们望而却步。

    展开全文
  • 怎么实现服务器给android客户端主动推送消息 推荐于2016-03-04 07:32:55 最佳答案 一、消息推送基础消息推送,就是在互联网上通过定期传送用户需要的信息来减少信息过载的一项新技术。推送技术通过自动传送...

    怎么实现服务器给android客户端主动推送消息


    一、消息推送基础
    
    
    消息推送,就是在互联网上通过定期传送用户需要的信息来减少信息过载的一项新技术。推送技术通过自动传送信息给用户,来减少用于网络上搜索的时间。它根据用户的兴趣来搜索、过滤信息,并将其定期推给用户,帮助用户高效率地发掘有价值的信息

    当我们开发需要和服务器交互的移动应用时,基本上都需要和服务器进行交互,包括上传数据到服务器,同时从服务器上获取数据。
    一般情况下,客户端与服务器之间通讯客户端是主动的,但这就存在一个问题就是一旦服务器数据有更新或者服务器要下发通知给客户端只能等客户端连接的时候才能实现。这种方式使消息失去了实时性。
    如何使客户端能够实时的收到服务器的消息和通知,总体来说有两种方式,第一种是客户端使用Pull(拉)的方式,就是隔一段时间就去服务器上获取一下信息,看是否有更新的信息出现。第二种就是 服务器使用Push(推送)的方式,当服务器端有新信息了,则把最新的信息Push到客户端上。这样,客户端就能自动的接收到消息。 
    虽然Pull和Push两种方式都能实现获取服务器端更新信息的功能,但是明显来说Push方式比Pull方式更优越。因为Pull方式更费客户端的网络流量,更主要的是费电量,还需要我们的程序不停地去监测服务端的变化。  
    二、几种常见的解决方案实现原理
    1)轮询(Pull)方式:客户端定时向服务器发送询问消息,一旦服务器有变化则立即同步消息。
    2)SMS(Push)方式:通过拦截SMS消息并且解析消息内容来了解服务器的命令,但这种方式一般用户在经济上很难承受。
    3)持久连接(Push)方式:客户端和服务器之间建立长久连接,这样就可以实现消息的及时行和实时性。
    三、消息推送解决方案概述
    A、C2DM云端推送方案
    在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务。Android Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。
    该方案存在的主要问题是C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用。
    B、MQTT协议实现Android推送
    采用MQTT协议实现Android推送功能也是一种解决方案。MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。
    wmqtt.jar 是IBM提供的MQTT协议的实现。我们可以从这里(https://github.com/tokudu/AndroidPushNotificationsDemo)下载该项目的实例代码,并且可以找到一个采用PHP书写的服务器端实现(https://github.com/tokudu/PhpMQTTClient)。
    C、RSMB实现推送功能
    Really Small Message Broker (RSMB) ,是一个简单的MQTT代理,同样由IBM提供,其查看地址是:http://www.alphaworks.ibm.com/tech/rsmb。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。SAM是一个针对MQTT写的PHP库。我们可以从这个http://pecl.php.net/package/sam/download/0.2.0地址下载它.
    D、XMPP协议实现Android推送
    Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。
    androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。但也存在一些不足之处:
    1) 比如时间过长时,就再也收不到推送的信息了。
    2)性能上也不够稳定。
    3)如果将消息从服务器上推送出去,就不再管理了,不管消息是否成功到达客户端手机上。
    如果我们要使用androidpn,则还需要做大量的工作,需要理解XMPP协议、理解Androidpn的实现机制,需要调试内部存在的BUG。
    E、使用第三方平台
    目前国内、国外有一些推送平台可供使用,但是涉及到收费问题、保密问题、服务质量问题、扩展问题等等,又不得不是我们望而却步。
    四、消息推送完美方案
    综合以上论述,在建立Android消息推送方面可谓方案多多,但每一款方案都有其优缺点。但无论如何,还是自己搭建一个推送平台是上策。因为你有、他有不如自己有。
    举个例子,在搭建自有推送平台上建议使用《某某Android消息推送组件》。该组不仅可以拿来即用,并且还可以提供源码以便扩展,实现自己的特殊需求。
    A、推送原理
    Android消息推送组件基于XMPP协议实现Android推送。XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。
    展开全文
  • 类似支付宝条码支付,支付结果是如何通知给app客户端的,是轮训还是建立的长连接,求知道的大神帮助下
  • 微信小程序中服务器主动向小程序多个客户端发送通知消息(模板消息)的解决方法
  • 服务器主动推送消息数据给客户端

    万次阅读 2019-02-11 15:17:14
    这个问题第一次是我在实现一个导师的方案的时候所发现的,一开始我需要实现服务器客户端的密钥协商和数据传递,服务器需要主动分发(推送)密钥给客户端,因为以前没有做过相关编码,后来只能想到用反向连接,也...
  • 引言: 普通情况下,有客户端服务器发送请求,获得数据后返回结果,并关闭二者之间的通信信道 服务器主动推送的方式 1.轮询 这种方式实际上并不是服务器主动,而是引言中提到的方式。 简单来说是客户端定时...
  • 主动模式:客户端与服务器21端口建立链接后,会发送port命令,通知服务器某个端口,然后又服务器主动链接该端口进行数据传输; 被动模式:客户端与服务器21端口(控制端口)建立链接后,会等待服务器的port命令,...
  • Signalr如何在服务器主动发送消息到客户端 情景:譬如一些系统消息的通知,会在服务端主动发送消息到客户端, 第一步:先确定要在哪一个Hub发; 第二步:取得该Hub的上下文,就可以调用相应的方法了
  • 服务器如何判断客户端非正常掉线-心跳连接 心跳:如果不主动关闭socket的话,系统不会自动关闭的,除非当前进程挂掉了,操作系统把占用的socket回收了才会关闭。为什么需要心跳连接主要是判断当前连接...
  • 服务器端createServer的回调函数被执行时,说明来了一个新的客户端发起的连接: server = net.createServer(function (socket) { sender = socket.remoteAddress + ":" + socket.remotePort clients....
  • 客户端得到通知的方式 定时刷新 每个一段时间刷新一次页面 ...由客户端主动发送请求,建立一个长连接通道,服务器端可以向客户端推送消息 优点:实时性好,性能也可以 缺点:长期占用长连接的资源 Dwr介绍 基于...
  • 服务器端推送技术的产生 1.1 Ajax应用中存在一个致命的缺陷无法满足传统桌面系统的需求:服务器端需要向客户端主动发送消息 2.服务器端推送技术的应用场景 2.1 网页邮箱新邮件提醒 2.2 网页聊天 2.3 微信签到墙...
  • 文章目录1. ==AJAX轮询==2. iframe3. comet长轮询(long polling...通常情况下,打开网页或app去查询或者刷新时,客户端服务器发出请求然后返回数据,客户端与服务端对应的模式是: 客户端请求–服务端响应, 而在有些...
  • 通常情况下,打开网页或app去查询或者刷新时,客户端服务器发出请求然后返回数据,客户端与服务端对应的模式是: 客户端请求--服务端响应, 而在有些情况下,服务端会主动推送一些信息到客户端,例如:新闻的订阅,天气的...
  • WebSocket安卓客户端实现详解(三)–服务端主动通知
  • 通常情况下,无论是web浏览器还是移动app,我们与服务器之间的交互都是主动的,客户端服务器端发出请求,然后服务器端返回数据给客户端客户端浏览器再将信息呈现,客户端与服务端对应的模式是: 客户端请求--...
  • C#服务器怎么知道客户端断开TCP连接

    千次阅读 2020-07-17 17:53:18
    1、正常情况下 客户端断开会产生错误,在连接里面能catch到 2、但是如果客户端是突然断电等情况下,不会产生这个错误 连接会一直等待下去 你可以用心跳包来解决 1、定义一个与客户连接相关的Boolean变量 b 2、...
  • WebSocket安卓客户端实现详解(三)--服务端主动通知

    千次阅读 多人点赞 2017-08-06 13:46:57
    WebSocket安卓客户端实现详解(三)–服务端主动通知本篇依旧是接着上一篇继续扩展,还没看过之前博客的小伙伴,这里附上前几篇地址 WebSocket安卓客户端实现详解(一)–连接建立与重连WebSocket安卓客户端实现详解(二)–...
  • 1. 在客户端使用隐藏 iframe,其src指向服务器端的控制代码,比如 server.php 2. 在server.php 通过 while 实现永不结束的请求,在循环内,实现断点,比如 sleep(2),表示每2秒钟循环一次 3.在每次循环中输出...
  • 最近做的Django项目中有一条需求是当用户写完邮件并选择抄送用户,用户发送邮件后,服务器主动会给在所有抄送用户发送一条提示。这里可以使用支持WebSoket协议的Channels。 思路简述: 用户登录时,浏览器会主动...
  • 只为实现技术,没有任何多余代码,非常适合学习。 服务端点start启动后标题变为server opeded 客户端点connect连接服务端,连接后服务端文本框中显示hello,9527 服务端点say,客户端会显示收到的消息hello,9527

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 64,848
精华内容 25,939
关键字:

服务器主动通知客户端