基于Web的数据推送技术

对于实时性数据显示要求比较高的系统,比如竞价,股票行情,实时聊天等,我们的解决方案有以下几种。
1.

HTTP请求发送模式,一般可以基于ajax的请求,比如每3秒一次访问下服务器,实现过程比较简单,只要需求不是太变态,基本上认为这个时间延迟可以接
受的话,那完全没有问题,不过服务端的压力有点大,访问量多的话,那就很容易挂了,这个也是为什么很多聊天室有人数限制的原因了,我怀疑一个聊天室就有一
台服务器撑着。

2.基于socket的推送方式,这个是真正的推送技术,服务器压力相对较小,但是要保持和客户端通讯的socket,以
便需要的时候可以拿到这个socket给用户发送消息。但是保持那么的socket也是耗资源的。而且郁闷的是我们的网页是不支持socket接受消息
的,不过可以通过flash或者applet来作为socket的客户端,他们都是可以嵌入到网页中的。浏览器的支持类型来说,还是flash会更友好
点。

下面给个例子,是服务器端的,主要功能是每3秒钟向客户端推送个时间

Server.java
----------------------------------------------
/**
*
*/
package com.spell;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Timer;

/**
* @author Administrator
*
*/
public class Server {
private int PORT = 9000;
private ServerSocket ss = null;
private Timer timer = new Timer();

public Server() {
try {
ss = new ServerSocket(PORT);
System.out.println("server start");
} catch (IOException e) {
e.printStackTrace();
}
}

/**
     * @param args
     */
public static void main(String[] args) {
Server server = new Server();
server.startup();

}

public void startup() {
Socket s = null;
while (true) {
try {
s = ss.accept();
Handler handler = new Handler(s);
timer.schedule(handler, 1000, 3000);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

Handler.java处理具体的事务
-----------------------------------------
/**
*
*/
package com.spell;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Date;
import java.util.TimerTask;

/**
* @author Administrator
*
*/
public class Handler extends TimerTask {
private Socket socket;

public Handler(Socket socket) {
this.socket = socket;

}

@Override
public void run() {
String nowTime = (new Date()).toLocaleString();
try {
if (socket != null && socket.isConnected()) {
// 这里打个擦边球,先发送个紧急的数据包,如果发送发送了异常,说明客户端已经关闭了socket连接了,进入异常处理程序
socket.sendUrgentData(0xFF);
System.out.println(nowTime);
PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket
.getOutputStream()));
pw.append(nowTime);
pw.append("\r");
pw.flush();
}
} catch (IOException e) {
try {
socket.close();
} catch (IOException e2) {
}
this.cancel();
}

}

}

applet程序:
-------------------------------------------------
/**
*
*/
package com.spell;

import java.applet.Applet;
import java.awt.Label;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

/**
* 此程序eclipse运行良好,但是在IE中引入该Applet就出错了,提示access denied
* 是由于客户端的安全策略引起的,看来还是要用flash比较靠谱
*
*/
public class SocketApplet extends Applet implements Runnable {
Label text = new Label();
private Socket socket;
private BufferedReader br;

public SocketApplet() {

}

public void init() {
text.setText("time begin");
add(text);
try {
socket = new Socket("172.21.1.112", 9000);
// socket = new Socket("127.0.0.1", 9000);
br = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
text.setText("socket setup ok ...");
// 初始化完毕,启动线程处理
new Thread(this).start();
} catch (Exception e) {
text.setText(e.getMessage());
}
}

public void run() {
while (true) {
try {
text.setText(br.readLine());
} catch (IOException e) {

}
}
}

}

---flash socket的解决方案
flex代码:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
</fx:Declarations>
<s:Label x="157" y="98" text="my time" height="22" width="230" id="message"/>
<s:Button x="153" y="126" label="begin socket" id="btn" click="changeText()"/>
<s:Button x="153" y="155" label="end socket" id="btn2" enabled="false" click="endSocket()"/>

<fx:Script>
<![CDATA[
var mysocket:Socket;
var host:String="127.0.0.1";
var str:String;
var port:int=9000;
public function changeText():void {
btn.enabled=false;
btn2.enabled=true;
mysocket=new Socket();
mysocket.addEventListener( ProgressEvent.SOCKET_DATA, onSocketData );
mysocket.connect(host,port);
}

private function onSocketData( event:ProgressEvent ):void {
trace( "Socket received " + mysocket.bytesAvailable + " byte(s) of data:" );
var data:String = mysocket.readUTFBytes(mysocket.bytesAvailable);
message.text=data;
}

public function endSocket():void {
mysocket.close();
btn.enabled=true;
btn2.enabled=false;
}
]]>
</fx:Script>
</s:Application>

概念引申阅读:
http://www.javaeye.com/topic/701526

基于Web的数据推送技术(转)的更多相关文章

  1. 基于HTTP协议之WEB消息实时推送技术原理及实现

    很早就想写一些关于网页消息实时推送技术方面的文章,但是由于最近实在忙,没有时间去写文章.本文主要讲解基于 HTTP1.1 协议的 WEB 推送的技术原理及实现.本人曾经在工作的时候也有做过一些用到网页 ...

  2. Web端服务器推送技术原理分析及dwr框架简单的使用

    1 背景 “服务器推送技术”(ServerPushing)是最近Web技术中最热门的一个流行术语.它是继“Ajax”之后又一个倍受追捧的Web技术.“服务器推送技术”最近的流行跟“Ajax ”有着密切 ...

  3. Web端server推送技术原理分析及dwr框架简单的使用

    1 背景 "server推送技术"(ServerPushing)是近期Web技术中最热门的一个流行术语.它是继"Ajax"之后又一个倍受追捧的Web技术.&qu ...

  4. Web服务器主动推送技术

    HTTP协议遵循经典的客户端-服务器模型,客户端发送一个请求,然后等待服务器端的响应,服务器端只能在接收到客户端的请求之后进行响应,不能主动的发送数据到客户端. 客户端想要在不刷新页面的情况下实时获取 ...

  5. javascript之数据推送

    我们使用ajax与后台服务进行交互,常常是通过触发事件来单次交互,但对于有些web应用来说,需要前台与后台保持长连接,前端不定时地接收后台推送的数据信息, 例如:股票行情分析.聊天室和网页在线游戏等. ...

  6. 理解HTML5数据推送应用开发问题

    一.数据推送 SSE是一种允许服务端向客户端推送新数据(通常称作数据推送)的HTML5技术.那么,究竟什么是数据推送?它与我们可能用过的其他技术有什么不同呢? 让我先来回答什么不是数据推送.数据推送有 ...

  7. HTML5中的SSE(服务器推送技术)

    本文原链接:https://cloud.tencent.com/developer/article/1194063 SSE技术详解:一种全新的HTML5服务器推送事件技术 前言 概述 基本介绍 与We ...

  8. HTML5数据推送SSE原理及应用开发

    JavaScript表达行为,CSS表达外观,注意HTML既表达结构(逻辑结构),又表达内容(数据本身)通常需要更新数据时,并不需要更新结构,正是这种不改变组织结构仅改变数据的诉求,推动了数据拉取和数 ...

  9. HTML5 SSE 数据推送应用开发

    javascript表达行为,css表达外观,注意HTML既表达结构(逻辑结构),又表达内容(数据本身)通常需要更新数据时,并不需要更新结构,正是这种不改变组织结构仅改变数据的诉求,推动了数据拉取和数 ...

随机推荐

  1. 编写基于outlook显示的html邮件需要注意的问题

    outlook对于html的支持是有限制的,在编写这些html的时候注意遵循以下规则: Never use colspans or rowspans. Always set correct dimen ...

  2. Card Game Cheater---hdu1528(扑克建图求二分匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1528 题意就是给有两个人有n张牌第二个人知道第一个人的牌的序列: 然后第二个人尽可能的让自己得更高的分 ...

  3. DWR3.0 dwr 返回值(数组,集合,Map)

    首先导入项目所需要的包,如下:dwr.jar,commons-logging-1.0.4.jar,版本可以调整 1.web.xml<?xml version="1.0" en ...

  4. [c/c++]指针数组 pk 数组指针

    首先强调 指针数组归根结底是个数组:数组指针归根结底是个指针. 数组指针 以int (*int)[10]为例 ()的优先级大于[],因此首先它是一个指针,它指向一个数组,数组的维数是10.因此数组指针 ...

  5. 动态库加载出错,cannot restore segment prot after reloc: Permission denied

    转自:taolinke的博客 项目中碰到的问题,编译好的so文件,放到其他机器上去加载,报了错误,cannot restore segment prot after reloc: Permission ...

  6. 数据仓库的自动ETL研究

    但是,在实施数据集成的过程中,由于不同用户提供的数据可能来自不同的途径,其数据内容.数据格式和数据质量千差万别,有时甚至会遇到数据格式不能转换或数据转换格式后丢失信息等棘手问题,严重阻碍了数据在各部门 ...

  7. KVM/QEMU桥接网络设置及kvm资料

    KVM/QEMU桥接网络设置 配置kvm的网络有2种方法.其一,默认方式为用户模式网络(Usermode Networking),数据包由NAT方式通过主机的接口进行传送.其二,使用桥接方式(Brid ...

  8. spring mvc 导出 excel

    // js 触发导出 excel 方法 导出当前页的数据 含有条件查询的结果 // js 框架使用的 是 easyui function doExport(){ var optins = $(&quo ...

  9. iPhone 屏幕上的 Home 键在哪里?(已解决)

    「问」:iPhone屏幕上的Home键如何开启? 「答」:在[设置]-[通用]-[辅助功能]-[AssistiveTouch],打开即可.不需要下载什么App. [Settings] - [Gener ...

  10. 下拉刷新控件(1)PullToRefreshList示例

    有很多控件都可以下拉刷新如,ListView,ExpandableListView,GridView,ScrollView,ViewPager,WebView等, 其中最常见的是ListView.本文 ...