comet 推送消息到客户端
weiconfig:
<system.web>
<httpHandlers>
<add path="comet_broadcast.ashx" type="AsnyHandler" verb="POST,GET"/>
</httpHandlers>
<compilation debug="true" targetFramework="4.0"/>
<httpRuntime/>
</system.web>
一般处理程序Handler1:
public class Handler1 : IHttpHandler
{ public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.Write("Hello World:" + DateTime.Now.ToString("HH:mm:ss"));//需要输出特定的信息的,可以在这里处理,例如读取数据库的最新参数啊,获取memcached的值之类的都行.
} public bool IsReusable
{
get
{
return false;
}
}
}
页面:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<style type="text/css">
* {
font-size: 12px;
} #divResult {
border: 1px solid #;
width: 250px;
}
</style>
<script src="Scripts/jquery-1.3.2.min.js"></script>
<script type="text/javascript">
function fUpdateData(data) { $.post("comet_broadcast.ashx", { content: data },
function (data, status) {
alert(data);
var result = $("#divResult");
result.html(result.html() + "<br/>" + data);
// $("#divResult").html(data);
//服务器返回消息,再次请求后台数据
fGetData();
}, "html"
);
}
//获取服务器最新信息
function fGetData() {
$.ajax({
type: 'GET',
url: 'Handler1.ashx',
success: function (data) { fUpdateData(data);
}
});
}
$(document).ready(function () {
//初始化
fGetData();
});
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
后台推送最新消息:
<div id="divResult">
</div>
</div>
</form>
</body>
</html>
AsnyHandler类与 myAsynResult类:
public class AsnyHandler:IHttpAsyncHandler
{
public AsnyHandler()
{
} public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
//myAsynResult为实现了IAsyncResult接口的类,当不调用cb的回调函数时,该请求不会返回到给客户端,会一直处于连接状态
myAsynResult asyncResult = new myAsynResult(context, cb, extraData);
String content = context.Request.Params["content"]; //向Message类中添加该消息
Messages.Instance().AddMessage(content, asyncResult);
return asyncResult;
} #region 不必理会 public void EndProcessRequest(IAsyncResult result)
{ } public bool IsReusable
{
get { return false; ; }
} public void ProcessRequest(HttpContext context)
{
}
#endregion
}
public class myAsynResult : IAsyncResult
{
bool _IsCompleted = false;
private HttpContext context;
private AsyncCallback cb;
private object extraData;
public myAsynResult(HttpContext context, AsyncCallback cb, object extraData)
{
this.context = context;
this.cb = cb;
this.extraData = extraData;
}
private string _content;
public string Content {
get {return _content;}
set{_content=value;}
} #region IAsyncResult接口
public object AsyncState
{
get { return null; }
} public System.Threading.WaitHandle AsyncWaitHandle
{
get { return null; }
} public bool CompletedSynchronously
{
get { return false; }
}
public bool IsCompleted
{
get { return _IsCompleted; }
}
#endregion //在Message类中的添加消息方法中,调用该方法,将消息输入到客户端,从而实现广播的功能
public void Send(object data)
{
context.Response.Write(this.Content);
if (cb!=null)
{
cb(this);
}
_IsCompleted = true; ;
}
}
Messages类:
public class Messages
{
//记录所有请求的客户端
List<myAsynResult> clients = new List<myAsynResult>(); #region 实现该类的单例
private static readonly Messages _Instance = new Messages();
private Messages()
{
}
public static Messages Instance()
{
return _Instance;
}
#endregion public void AddMessage(string content,myAsynResult asyncResult)
{
//当传入的内容为"-1"时,表示为建立连接请求,即为了维持一个从客户端到服务器的连接而建立的连接
//此时将该连接保存到 List<myAsynResult> clients中,待再有消息发送过来时,该连接将会被遍历,并且会将该连接输出内容后,结束该连接
if (content=="-1")
{
clients.Add(asyncResult);
}
else
{
//将当前请求的内容输出到客户端
asyncResult.Content = content;
asyncResult.Send(null); //否则将遍历所有已缓存的client,并将当前内容输出到客户端
foreach (myAsynResult result in clients)
{
result.Content = content;
result.Send(null);
} //清空所有缓存
clients.Clear();
}
}
}
comet 推送消息到客户端的更多相关文章
- Spring Boot 集成 WebSocket 实现服务端推送消息到客户端
假设有这样一个场景:服务端的资源经常在更新,客户端需要尽量及时地了解到这些更新发生后展示给用户,如果是 HTTP 1.1,通常会开启 ajax 请求询问服务端是否有更新,通过定时器反复轮询服务端响应的 ...
- Java Springboot webSocket简单实现,调接口推送消息到客户端socket
Java Springboot webSocket简单实现,调接口推送消息到客户端socket 后台一般作为webSocket服务器,前台作为client.真实场景可能是后台程序在运行时(满足一定条件 ...
- android不需要Socket的跨进程推送消息AIDL!
上篇介绍了跨进程实时通讯http://www.cnblogs.com/xiaoxiaing/p/5818161.html 但是他有个缺点就是服务端无法推送消息给客户端,今天这篇文章主要说的就是服务器推 ...
- Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送
Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送, ...
- Android为TV端助力 不需要Socket的跨进程推送消息AIDL!
上篇介绍了跨进程实时通讯http://www.cnblogs.com/xiaoxiaing/p/5818161.html 但是他有个缺点就是服务端无法推送消息给客户端,今天这篇文章主要说的就是服务器推 ...
- 使用极光推送(www.jpush.cn)向安卓手机推送消息【服务端向客户端主送推送】C#语言
在VisualStudio2010中新建网站JPushAndroid.添加引用json帮助类库Newtonsoft.Json.dll. 在web.config增加appkey和mastersecret ...
- IOS 推送-客户端处理推送消息
IOS 推送-客户端处理推送消息 1.推送调用顺序 APN push的消息到达后,UIApplicationDelegate有两个方法和处理消息有关: 1)application:didReceive ...
- DWR实现服务器向客户端推送消息
原文链接 http://www.blogjava.net/stevenjohn/archive/2012/07/07/382447.html这片文章还是给了我很大帮助,再次表示感谢,下面我将这两天的研 ...
- HTML5服务器推送消息的各种解决办法
摘要 在各种BS架构的应用程序中,往往都希望服务端能够主动地向客户端推送各种消息,以达到类似于邮件.消息.待办事项等通知. 往BS架构本身存在的问题就是,服务器一直采用的是一问一答的机制.这就意味着如 ...
随机推荐
- windows操作系统中安装、启动和卸载memcached
今天总结一下如何在Windows操作系统中安装.启动和卸载memcached:下载地址: http://download.csdn.net/download/wangshuxuncom/8249501 ...
- 机器学习数学知识中令人费解的notation符号注解
$argmin_xf(x), min(f(x))$ $min(f(x))$的意思是函数$f(x)$的最小值 $argmin$的意思是返回使得表达式取得最小值时对应的输入变量值.例如$argmin_xf ...
- 【转】数据分析与处理之二(Leveldb 实现原理)
郑重声明:本篇博客是自己学习 Leveldb 实现原理时参考了郎格科技系列博客整理的,原文地址:http://www.samecity.com/blog/Index.asp?SortID=12,只是为 ...
- mysqlbinlog usage
[root@localhost mysql3306]# mysqlbinlogmysqlbinlog Ver 3.4 for el7 at x86_64Copyright (c) 2000, 2018 ...
- 铁乐学python_day01-作业
第一题:使用while循环输入 1 2 3 4 5 6 8 9 10 # 使用while循环输入 1 2 3 4 5 6 8 9 10 count = 0 while (True) : count = ...
- win8中 cmd直接以管理员权限运行
一.组合键 WIN+X 二.锁定到任务栏,方便以后快速启动 三.控制面板->控制中心 四.更改用户账户控制设置--调到最低 好了,点击任务栏的命令提示符
- 高级IO
# 高级IO 特殊的IO操作,包括文件锁.系统V的流.信号驱动的I/O.多路转I/O(select和pull函数).readv和writev函数以及存贮映射I/O等概念和函数. ## 文件锁 文件锁是 ...
- ZT linux的mount(挂载)命令详解
linux的mount(挂载)命令详解 来源:互联网 作者:佚名 时间:09-08 17:02:27 [大 中 小] 点评:linux下挂载(mount)光盘镜像文件.移动硬盘.U盘.Window ...
- 获取索引--------用range()和len()
a = ['Google', 'Baidu', 'Runoob', 'Taobao', 'QQ'] for i in range(len(a)): print(i+1,a[i])
- arcgis 10.1 导入数据到oracle 发布地图服务
机器配置说明 数据库服务器 系统:linux 软件:oracle 11G 64位 Arcgis server服务器 系统:win7 专业版 软件:arcgis server 10.1.win64_11 ...