实现web消息推送的技术和采用长轮询corundumstudio介绍

实时消息的推送,PC端的推送技术可以使用socket建立一个长连接来实现。传统的web服务都是客户端发出请求,服务端给出响应。但是现在直观的要求是允许特定时间内在没有客户端发起请求的情况下服务端主动推送消息到客户端。

有哪些可以实现web消息推送的技术:

  • 不断地轮询(俗称“拉”,polling)是获取实时消息的一个手段:Ajax 隔一段时间(通常使用 JavaScript 的 setTimeout 函数)就去服务器查询是否有改变,从而进行增量式的更新。但是间隔多长时间去查询成了问题,因为性能和即时性造成了严重的反比关系。间隔太短,连续不断的请求会冲垮服务器,间隔太长,务器上的新数据就需要越多的时间才能到达客户机。

    • 优点:服务端逻辑简单;
    • 缺点:其中大多数请求可能是无效请求,在大量用户轮询很频繁的情况下对服务器的压力很大;
    • 应用:并发用户量少,而且要求消息的实时性不高,一般很少采用;
  • 长轮询技术(long-polling):客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息或超时(设置)才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
    • 优点:实时性高,无消息的情况下不会进行频繁的请求;
    • 缺点:服务器维持着连接期间会消耗资源;
  • 基于Iframe及htmlfile的流(streaming)方式:iframe流方式是在页面中插入一个隐藏的iframe,利用其src属性在服务器和客户端之间创建一条长链接,服务器向iframe传输数据(通常是HTML,内有负责插入信息的javascript),来实时更新页面。
    • 优点:消息能够实时到达;
    • 缺点:服务器维持着长连接期会消耗资源;
  • 插件提供socket方式:比如利用Flash XMLSocket,Java Applet套接口,Activex包装的socket。
    • 优点:原生socket的支持,和PC端和移动端的实现方式相似;
    • 缺点:浏览器端需要装相应的插件;
  • WebSocket:是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。
    • 优点:更好的节省服务器资源和带宽并达到实时通讯;
    • 缺点:目前还未普及,浏览器支持不好;

综上,考虑到浏览器兼容性和性能问题,采用长轮询(long-polling)是一种比较好的方式。

netty-socketio是一个开源的Socket.io服务器端的一个java的实现, 它基于Netty框架。 项目地址为: https://github.com/mrniko/netty-socketio

以下是一个来自netty-socketio的推送示例,web聊天系统。

服务器端push server:

消息实体:

 

监听事件:

package com.nettysocketio.test;

import com.corundumstudio.socketio.AckRequest;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.listener.DataListener;

public class CharteventListener implements DataListener<ChatObject> {

    SocketIOServer server;

    public void setServer(SocketIOServer server) {
        this.server = server;
    }

    public void onData(SocketIOClient client, ChatObject data,
            AckRequest ackSender) throws Exception {
        // chatevent为 事件的名称, data为发送的内容
        this.server.getBroadcastOperations().sendEvent("chatevent", data);
    }
}

推送服务:

package com.nettysocketio.test;

import com.corundumstudio.socketio.Configuration;
import com.corundumstudio.socketio.SocketIOServer;

public class App {
    public static void main(String[] args) throws InterruptedException
    {
        Configuration config = new Configuration();
        config.setHostname("localhost");
        config.setPort(9092);

        SocketIOServer server = new SocketIOServer(config);
        CharteventListener listner = new CharteventListener();
        listner. setServer(server);
        // chatevent为事件名称
        server.addEventListener("chatevent", ChatObject.class, listner);
        //启动服务
        server.start();
        Thread.sleep(Integer.MAX_VALUE) ;
        server.stop();
    }
}

浏览器端Client:

客户端使用的是socket.io-client,项目地址为:https://github.com/Automattic/socket.io-client

客户端聊天代码:

最近公司开发的项目,其中一个基于bpm2.0的流程任务办理消息处理就是用的这个。

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Socketio chat</title>
<script src="./jquery-1.7.2.min.js" type="text/javascript"></script>
<script type="text/javascript" src="./socket.io/socket.io.js"></script>
<style>
body {
    padding: 20px;
}
#console {
    height: 400px;
    overflow: auto;
}
.username-msg {
    color: orange;
}
.connect-msg {
    color: green;
}
.disconnect-msg {
    color: red;
}
.send-msg {
    color: #888
}
</style>
</head>
<body>
    <h1>Netty-socketio chat demo</h1>
    <br />
    <div id="console" class="well"></div>
    <form class="well form-inline" onsubmit="return false;">
        <input id="name" class="input-xlarge" type="text" placeholder="用户名称. . . " />
        <input id="msg" class="input-xlarge" type="text" placeholder="发送内容. . . " />
        <button type="button" onClick="sendMessage()" class="btn">Send</button>
        <button type="button" onClick="sendDisconnect()" class="btn">Disconnect</button>
    </form>
</body>
<script type="text/javascript">
    var socket = io.connect(‘http://localhost:9092‘);
    socket.on(‘connect‘,function() {
        output(‘<span class="connect-msg">Client has connected to the server!</span>‘);
    });

    socket.on(‘chatevent‘, function(data) {
        output(‘<span class="username-msg">‘ + data.userName + ‘ : </span>‘
                + data.message);
    });

    socket.on(‘disconnect‘,function() {
        output(‘<span class="disconnect-msg">The client has disconnected! </span>‘);
    });

    function sendDisconnect() {
        socket.disconnect();
    }

    function sendMessage() {
        var userName = $("#name").val()
        var message = $(‘#msg‘).val();
        $(‘#msg‘).val(‘‘);
        socket.emit(‘chatevent‘, {
            userName : userName,
            message : message
        });
    }

    function output(message) {
        var currentTime = "<span class=‘time‘ >" + new Date() + "</span>";
        var element = $("<div>" + currentTime + " " + message + "</div>");
        $(‘#console‘).prepend(element);
    }
</script>
</html>

先运行push server,再打开chat html就可以看到连接信息和服务器推送的聊天信息。

参考:

https://github.com/mrniko/netty-socketio

https://github.com/mrniko/netty-socketio-demo

时间: 2024-08-08 09:38:44

实现web消息推送的技术和采用长轮询corundumstudio介绍的相关文章

WEB消息推送-comet4j

一.comet简介: comet :基于 HTTP长连接的"服务器推"技术,是一种新的 Web 应用架构.基于这种架构开发的应用中,服务器端会主动以异步的方式向客户端程序推送数据,而不需要客户端显式的发出请求.Comet 架构非常适合事件驱动的 Web 应用,以及对交互性和实时性要求很强的应用,如股票交易行情分析.聊天室和 Web 版在线游戏等. 二.comet4j功能特性 推送消息广播. 推送定向消息. 提供连接上线前.上线.下线前.下线.发送消息等多种可处理事件. 消息缓存机制,确

web消息推送-goesay

原文:http://www.upwqy.com/details/22.html 1 GoEasy简介: GoEasy - Web实时消息推送服务专家 最简单的方式将消息从服务器端推送至客户端 最简单的方式将消息从各种客户端推送至客户端 任何Web浏览器 任何开发语言 实时高效  隐私安全 稳定可靠 简单易用 2 注册获取到相关配置 注册链接:https://center.goeasy.io/cn/account/form 3 登录后创建免费应用 获取相关配置 创建一个免费应用  有一年的试用期

基于ajax与msmq技术的消息推送功能实现

周末在家捣鼓了一下消息推送的简单例子,其实也没什么技术含量,欢迎大伙拍砖.我设计的这个推送demo是基于ajax长轮询+msmq消息队列来实现的,具体交互过程如下图: 先说说这个ajax长轮询,多长时间才算长呢?这个还真不好界定.这里是相对普通ajax请求来说的,通常处理一个请求也就是毫秒级别的时间.但是这里的长轮询方式在ajax发送请求给服务器之后,服务器给调用端返回数据的时间多长那可还真不好说.嘿嘿,这关键要看我们啥时候往msmq队列中推送数据了,先看看推送的效果图吧..... 抱歉,没弄张

基于ajax与msmq技术的消息推送功能如何实现?

本文和大家分享的主要是基于ajax与msmq技术的消息推送功能相关实现方法,一起来看看吧,希望对大家学习ajax 有所帮助. 我设计的这个推送demo是基于ajax长轮询+msmq消息队列来实现的,具体交互过程如下图: 先说说这个ajax长轮询,多长时间才算长呢?这个还真不好界定. 这里是相对普通ajax请求来说的,通常处理一个请求也就是毫秒级别的时间.但是这里的长轮询方式 在ajax发送请求给服务器之后,服务器给调用端返回数据的时间多长那可还真不好说.嘿嘿,这关键要看 我们啥时候往msmq队列

SignalR Self Host+MVC等多端消息推送服务(1)

一.概述 由于项目需要,最近公司项目里有个模块功能,需要使用到即时获得审批通知:原本的设计方案是使用ajax对服务器进行定时轮询查询,刚刚开始数据量和使用量不大的时候还好,后来使用量的增加和系统中各种业务的复杂度增加,服务器的压力也越来越大,于是我想使用消息推送的方式替换掉ajax轮询查询,当有审批提交时,调用推送方法,将消息推送到下一审批人那,这样就减低了服务器的压力. Signal 是微软支持的一个运行在.NET平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推

消息推送技术

消息推送 消息推送是针对 Web 应用开发领域的技术,指服务端以主动方式将信息送达客户端.主要用于提升用户体验,避免用户刷新页面从服务端拉取数据.例如 Web 邮件中自动出现刚收到的邮件项,Web 即时通讯自动提示新到消息等应用场景. 要实现消息推送机制,涉及两方面的内容: Web 层消息推送 服务层消息服务 Web 层消息推送 套接字 可以使用套接字接口进行全双工通讯.可以通过 Flash XMLSocket.Java Applet 技术实现.但由于实现方案与厂商技术绑定过紧,不属于 Web

消息推送

http://blog.csdn.net/axi295309066/article/details/53180628 消息推送 标签: 消息推送push极光推送小米推送即时通信 2016-11-16 00:16 70人阅读 评论(0) 收藏 举报 分类: Android基础(79) 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 消息推送,即时通信,目的:想办法让服务器能够及时的通知客户端 消息推送最简单的方法就是使用第三方的,比如现在使用比较多的是小米推送.极光推送,消

基于 Pushlets 的消息推送设

Pushlets 是通过长连接方式实现“推”消息的.推送模式分为:Poll(轮询).Pull(拉).本文围绕 Pull 模式进行设计. 原理 客户端发起请求,服务端接收到请求后根据 Pushlets 协议进行处理.推数据通过 HTTP 响应返回. 客户端在接收到响应后根据 Pushlets 协议进行处理,重新发起请求.Pull 模式时序: join:join 请求,服务器端建立 Pushlet 会话 join-ack:join 应答,返回会话 id listen:订阅并监听主题 listen-a

Android消息推送:手把手教你集成小米推送

前言 在Android开发中,消息推送功能的使用非常常见. 为了降低开发成本,使用第三方推送是现今较为流行的解决方案. 今天,我将手把手教大家如何在你的应用里集成小米推送 该文档基于小米推送官方Demo,并给出简易推送Demo 看该文档前,请先阅读我写的另外两篇文章: 史上最全解析Android消息推送解决方案 Android推送:第三方消息推送平台详细解析 目录 1. 官方Demo解析 首先,我们先对小米官方的推送Demo进行解析. 请先到官网下载官方Demo和SDK说明文档 1.1 Demo