Java_模拟comet的实现
本文没有使用任何comet服务器, 只是利用tomcat模拟实现了一下comet, 不是真正的comet哦,因为不会有这样的应用场景, 只是模拟实现, 仅供参考.
一. 需求.
实现将服务端的时间推送到客户端, 客户端在得到服务端相应后将时间显示在页面上.
二.实现.
1开发框架: 用jsp+servlet的方法, 用了一个webframework框架, 自己写的, 类似于struts2, 可以的话就把它当作struts2来看吧.
2. jsp代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
<%@ page language= "java" import= "java.util.*" pageEncoding= "UTF-8" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+ "://" +request.getServerName()+ ":" +request.getServerPort()+path+ "/" ;
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
<html>
<head>
<base href= "<%=basePath%>" >
<title>My JSP 'serverTime.jsp' starting page</title>
<meta http-equiv= "pragma" content= "no-cache" >
<meta http-equiv= "cache-control" content= "no-cache" >
<meta http-equiv= "expires" content= "0" >
<meta http-equiv= "keywords" content= "keyword1,keyword2,keyword3" >
<meta http-equiv= "description" content= "This is my page" >
<!--
<link rel= "stylesheet" type= "text/css" href= "styles.css" >
-->
<script type= "text/javascript" >
var stop=false;
var div= "" ;
var inited = false;
function init(){
div = document.getElementById( "forDisplay" );
}
function stoped(){
stop=true;
}
function started(){
if (!inited){
init();
inited = true;
}
stop=false;
clear();
ajax();
}
function clear(){
if (div){
div.innerHTML= "" ;
}
}
function creatXHR(){
var xmlhttp_request = "" ;
try {
if ( window.ActiveXObject ){
for ( var i = 5; i; i-- ){
try {
if ( i == 2 ){
xmlhttp_request = new ActiveXObject( "Microsoft.XMLHTTP" ); }
else {
xmlhttp_request = new ActiveXObject( "Msxml2.XMLHTTP." + i + ".0" );
xmlhttp_request.setRequestHeader( "Content-Type" , "text/xml" );
xmlhttp_request.setRequestHeader( "Charset" , "gb2312" ); }
break ;
}
catch (e){
xmlhttp_request = false;
}
}
}
else if ( window.XMLHttpRequest ){
xmlhttp_request = new XMLHttpRequest();
}
}
catch (e){
xmlhttp_request = false;
}
return xmlhttp_request;
}
function ajax(){
var xmlhttp_request = creatXHR();
xmlhttp_request.open( 'GET' , 'ajax.action' , true);
xmlhttp_request.send(null);
xmlhttp_request.onreadystatechange = function (){
if (xmlhttp_request.readyState == 4) {
if (xmlhttp_request.status == 200){
var timeStr = xmlhttp_request.responseText;
div.innerHTML =timeStr+ "<br/>" +div.innerHTML;
}
if (!stop){
ajax();
}
}
}
}
</script>
</head>
<body>
<button value= "start" onclick= "started()" >Start</button> <button value= "stop" onclick= "stoped()" >Stop</button> <BR/>
<div id= "forDisplay" ></div>
</body>
</html>
|
前面我有篇文章谈到, 客户端做的事情很简单, 就是提交ajax请求, 等待服务端返回数据, 展示完后继续请求即可. 我这里做了个控制, 可以自由停止.
3.服务端代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
package org.jiacheo.webframework.test;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import org.jiacheo.web.framework.Template;
import org.jiacheo.web.framework.context.TemplateContext;
public class Time4Ajax implements Template {
@Override
public String execute() {
try {
PrintWriter writer =TemplateContext.getResponse().getWriter();
Random random = new Random();
int second = random.nextInt( 10 );
iambusy(second);
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat( "服务器时间是:yyyy年MM月dd日,HH时mm分ss秒" );
System.out.println(format.format(date));
writer.println(format.format(date));
writer.flush();
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null ;
}
private void iambusy( int second) {
// TODO Auto-generated method stub
final int oneSecond = 1000 ;
try {
Thread.sleep(oneSecond*second);
} catch (InterruptedException e) {
//ignore it
}
}
}
|
每次请求都随机sleep几秒, 模拟在处理事务, 得到处理完了再返回数据, 也就是吧服务端的时间推送到客户端去.
这样就可以模拟comet的实现了. 但这里跟comet最大的不同是, 服务端不是主动主动阻塞的, 如何做到服务端主动阻塞, 等待有了返回结果再返回给客户端, 这个服务端实现的一个难点.我之前提到可以用时间模型, 但是事件模型能做的东西实在太少了, 要是能从规范上搞定, 那这个实现就方便很多了.
测试结果:
客户端显示:
1
2
3
4
5
6
7
8
9
10
11
|
服务器时间是: 2010 年 11 月 25 日, 22 时 19 分 19 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 19 分 10 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 19 分 07 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 19 分 06 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 19 分 04 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 19 分 00 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 18 分 52 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 18 分 48 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 18 分 39 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 18 分 35 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 18 分 28 秒
|
服务端显示
1
2
3
4
5
6
7
8
9
10
11
|
服务器时间是: 2010 年 11 月 25 日, 22 时 18 分 28 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 18 分 35 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 18 分 39 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 18 分 48 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 18 分 52 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 19 分 00 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 19 分 04 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 19 分 06 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 19 分 07 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 19 分 10 秒
服务器时间是: 2010 年 11 月 25 日, 22 时 19 分 19 秒
|
注意我故意将客户端倒过来显示的. 可以看到, 客户端和服务端的数据是完全一致的.
comet, 比想想中的要难搞多了, 我能不能做个框架出来搞定他?
关于comet 框架和服务器, 可以看看 APE(ajax push engine)
转载于:https://www.cnblogs.com/gisblogs/p/4269638.html
Java_模拟comet的实现相关推荐
- 下面选项能正确表示JAVA_模拟试题2
Java语言程序设计模拟试题二 一.选择题:共20小题,每小题1分,满分20分:请将答案填入题后括号中. 1.以下的选项中能正确表示Java语言中的一个整型常量的是 ( ) A) 12. B) -20 ...
- 拱猪java_模拟——拱猪积分题解
题目:拱猪积分 描述: [问题描述] 拱猪是一种很有趣的扑克牌游戏. 即使你不知道它的玩法,你也可以由它的计分方式来了解它的趣味性. 假设在此我们仅考虑四个人的拱猪牌局,本题要求你根据下面的计分规则, ...
- book类 借书 java_模拟借书系统(Java入门第三季第一章练习)
程序流程图我就不放上来了,慕友们将就着看看吧,注释还算清晰. 这段代码是Java入门第三季异常与异常处理这一章的练习题, 代码尚有不足,请多多指教. /** * 功能:模拟借书系统 * 要求: * 1 ...
- Comet入门及最简单的Java Demo
在浏览网页的时候,假设有新的消息,怎样接收到?HTTP协议不能由server主动给client发送消息. 1.刷微博.逛论坛贴吧,想看最新的信息怎么办?F5刷新一下就OK了! 2.上面一种方式是被动的 ...
- Think in Pushlet
Think in Pushlet 作者: cleverpig 介绍 server端向浏览器client发送通知这种通讯模式在J2EE应用中很常见,通常使用采用 RMI. CORBA或者 ...
- 手动选择显示_【新品推介】Comet CAA500 MK2天线分析仪 | 高精度模拟十字针同时显示SWR和阻抗...
Comet CAA-500 MK2天线分析仪 高精度模拟十字针同时显示SWR和阻抗. 全彩色TFT LCD显示屏提供图形和数字SWR以及R和X值的总阻抗. 特征: 自动扫描模式 在LCD显示屏上自动绘 ...
- 无忧考吧2017二级java_无忧考吧二级JAVA超级模拟软件下载_无忧考吧二级JAVA超级模拟软件官方下载-太平洋下载中心...
无忧考吧二级JAVA超级模拟软件是一款可以帮助用户朋友来学习计算机二级java语言考试的软件,使用这款二级java模拟考试软件可以帮助用户快速的掌握学习内容和操作逻辑,让你顺利的通过二级java考试. ...
- 无忧考吧2017二级java_二级Java模拟软件|无忧考吧二级Java语言程序设计模拟软件下载 v2017.03官方版 - 121下载站...
无忧考吧二级Java语言程序设计模拟软件是专为准备考试二级JAVA语言的朋友打造的一款在线模拟软件,二级JAVA语言的考试理论上是非常简单的, 大家只需要掌握基本的语法和一些简单的编程就可能了,这款软 ...
- autoresetevent java_[原创]AutoResetEvent, ManualResetEvent的Java模拟
AutoResetEvent, ManualResetEvent是C#中常用的线程同步方法,在Java中可以模拟,AutoResetEvent使用Semaphore,增加的是许可证数量,程序里只有一个 ...
最新文章
- 【APUE】Chapter17 Advanced IPC sign extension 结构体内存对齐
- SPF难以解决邮件伪造的现状以及方案
- Matlab绘图--包含各种标示符的输入方法
- 论文浅尝 | 采用成对编码的图卷积网络用于知识图谱补全
- Tinker 热修复框架模拟使用
- Spring Cloud Sleuth + Zipkin 监控微服务(一)
- 学习mysql随笔——mysql的安装启动
- C语言——指针篇(二)指针和数组之内存分配和初始化
- UISearchBar--改变内部输入框的背景颜色
- .NET 中的对象序列化
- 05、ADS使用记录之集总参数匹配
- 零成本、零流量,我是如何空手反套白狼?
- 数字图像处理基本知识
- mysql 如何去掉毫秒_mysql 如何去掉毫秒值
- ROSLAUNCH 的.launch/XML 语法
- Android - 简单的查看APP启动时间
- RISC-V “异军”突起,英特尔:消灭不了就加入它
- oracle账号共享,登陆后可下载mysql和jdk
- 基于虚拟化的混合云集群——基于集群管理监控系统
- A可向容器中放甲乙两种物品,B只取甲种物品,C只取乙种物品,A每次只放一种物用品PV原理实现进程A、B、C 3个并行进程的同步
热门文章
- 13分钟,教你python可视化分析20W数据,找到妹子最爱的内衣
- android取消内存限制吗,Android 内存限制
- excel插入一列日期 pandas_在Excel目标列插入日期控件的方法
- c语言数据结构判断回文数,C++数据结构与算法之判断一个链表是否为回文结构的方法...
- linux系统修改只读文件权限如(etc/hosts)文件
- Eclipse中好用的快捷键
- ‘python3\r’: No such file or directory
- Java数据库表自动转化为PO对象
- Altium AD20常用的操作快捷键,个人总结精炼版,全干货超实用
- 深度学习之Image captioning的评分指标篇(BLEU、CIDEr)