当前位置:编程学习 > C#/ASP.NET >>

请教大家一个关于利用 推送技术 实现聊天的问题

我现在已经知道了如何使用 服务器推送技术,
但是我还是有一个问题不懂,就是两个网页之间到底如何交换信息的?
 就是说一个网页发送了一条消息,另外一个网页的会话在服务器是如何访问到的啊? --------------------编程问答-------------------- 占个沙发先。
说白了,有 A.aspx 页面和 B.aspx 页面。
A.aspx 页面发出了一段文字,B.aspx 页面如何能得到?
 不访问数据库,不使用 Application 保存聊天信息。那样服务器会爆掉的 --------------------编程问答-------------------- 有没有高手来啊?
小弟在线等啊。 --------------------编程问答-------------------- --------------------编程问答-------------------- 介个? --------------------编程问答-------------------- 有没有高手来啊,,,都等了一天了 --------------------编程问答-------------------- 声明一下,我是想做一个WEB聊天的。 --------------------编程问答-------------------- 首先你把A发送的信息发给服务器,存起来,然后B轮询获得。

轮询间隔时间稍微长一点,可以缓解服务器压力。 

(个人见解) --------------------编程问答--------------------
引用 7 楼  的回复:
首先你把A发送的信息发给服务器,存起来,然后B轮询获得。

轮询间隔时间稍微长一点,可以缓解服务器压力。 

(个人见解)

---------------------
可是服务器怎么存储了?
这就是我最大的疑问。 --------------------编程问答-------------------- 可是服务器怎么存储呢?我就是不知道这个。
引用 7 楼  的回复:
首先你把A发送的信息发给服务器,存起来,然后B轮询获得。

轮询间隔时间稍微长一点,可以缓解服务器压力。 

(个人见解)
--------------------编程问答-------------------- 有没有高手来教教小弟我啊。。。 --------------------编程问答--------------------

 Android推送通知指南
分类: 移动互联网 2011-06-23 15:26 16359人阅读 评论(47) 收藏 举报

在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相对比较麻烦,最近利用几天的时间对Android的推送通知服务进行初步的研究。

在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务,起初我就是准备采用这个服务来实现自己手机上的推送功能。

Android Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些消息。

但是经过一番研究发现,这个服务存在很大的问题:

1)C2DM内置于Android的2.2系统上,无法兼容老的1.6到2.1系统;

2)C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用,如果想要很好的使用,我们的App Server必须也在国外,这个恐怕不是每个开发者都能够实现的;

有了上述两个使用上的制约,导致我最终放弃了这个方案,不过我想利用另外一篇文章来详细的介绍C2DM的框架以及客户端和App Server的相应设置方法,可以作为学习与参考之用。

即然C2DM无法满足我们的要求,那么我们就需要自己来实现Android手机客户端与App Server之间的通信协议,保证在App Server想向指定的Android设备发送消息时,Android设备能够及时的收到。下面我来介绍几种常见的方案:

1)轮询:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。而且你还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池。

2)SMS:在Android平台上,你可以通过拦截SMS消息并且解析消息内容来了解服务器的意图。这是一个不错的想法,我就见过采用这个方案的应用程序。这个方案的好处是,可以实现完全的实时操作。但是问题是这个方案的成本相对比较高,你很难找到免费的短消息发送网关,关于这个方案的实现,可以参考如下链接:https://labs.ericsson.com/apis/mobile-java-push/。

3)持久连接:这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。Apple的推送服务之所以工作的很好,是因为每一台手机仅仅保持一个与服务器之间的连接,事实上C2DM也是这么工作的。不过这个方案也存在不足,就是我们很难在手机上实现一个可靠的服务。Android操作系统允许在低内存情况下杀死系统服务,所以你的通知服务很可能易做图作系统Kill掉了。

前两个方案存在明显的不足,第三个方案也有不足,不过我们可以通过良好的设计来弥补,以便于让该方案可以有效的工作。毕竟,我们要知道GMail,GTalk以及GoogleVoice都可以实现实时更新的。

 


这个是安卓的。但原理是一样的。真正的推送都需要有服务主动送数据,而客户端监听数据。

这是之前别人问的。
http://topic.csdn.net/u/20100125/10/855fc04e-8f2d-4da0-a114-bf53c75f7d8b.html

如果你要的是推送的这种html5可以实现。之下的协议是没有办法的。只能采用无刷新ajax这种。

还有的就是通过插件。比如Silverlight,flash这些个东东来做。 --------------------编程问答-------------------- 象ajax这种就不属于推送了。 --------------------编程问答-------------------- 大哥,你QQ号多少?
我能加你QQ请教一下你吗?
引用 12 楼  的回复:
象ajax这种就不属于推送了。
--------------------编程问答-------------------- 我现在如何使用推送技术,我已经知道了。
问题是我不知道,服务器是如何保存一个用户发出的信息的。
引用 13 楼  的回复:
大哥,你QQ号多少?
我能加你QQ请教一下你吗?
引用 12 楼  的回复:

象ajax这种就不属于推送了。
--------------------编程问答-------------------- 有没有高手在啊???
WEB聊天的时候,服务器是如何保存数据的啊? --------------------编程问答--------------------
引用 15 楼  的回复:
有没有高手在啊???
WEB聊天的时候,服务器是如何保存数据的啊?


服务器不持久保存什么数据,如果进程重启了,或者超过一定时间(例如3秒种),这个数据自然就没了。 --------------------编程问答-------------------- 大哥,那具体是怎么保存的呢?
我就是搞不懂如何短暂的保存。
引用 16 楼  的回复:
引用 15 楼  的回复:
有没有高手在啊???
WEB聊天的时候,服务器是如何保存数据的啊?


服务器不持久保存什么数据,如果进程重启了,或者超过一定时间(例如3秒种),这个数据自然就没了。
--------------------编程问答-------------------- http://blog.maartenballiauw.be/post/2011/11/29/Techniques-for-real-time-client-server-communication.aspx
类似原理~

http://geekswithblogs.net/jeroenb/archive/2011/12/14/signalr-starter-application.aspx

类库什么的,都有了,建个real time 的聊天系统,加起来就10多句代码,采用的是signalr。

你说的短暂保存,也就是收到消息后的前段显示拉。

对于消息的存储,如果要存数据库,收、发消息时候处理即可。也就是SQL 的INSERT 这些咯。


--------------------编程问答--------------------
引用 17 楼  的回复:
大哥,那具体是怎么保存的呢?
我就是搞不懂如何短暂的保存。


晕死!什么叫做保存?

既然你实现了服务器推送功能,那么编程序可能就是这样的
if(msg is 路由消息)
{
    var x= (路由消息)msg;
    var client= GetTcpClient(x.TargetUser);
    MySocket.SendMessage(msg, client);
}
else
    ......


这保存什么?消息只是一个局部变量引用一下,转发给另外一个客户端,就扔掉了。 --------------------编程问答-------------------- 对于所谓的“http长连接”也是一样,只不过这里的 tcp client 概念换成 http context 而已。当客户端访问服务器的时候,服务器“挂起”了 HttpContext 到一个队列中,这时这个客户端也就被挂起了,等服务器此 context 的 Response 操作 并且执行其 .Close 操作之后,服务器从队列中彻底删除此 HttpContext。这也许算是有存储,但是仅限于内存中,跟数据库毫无关系。

而消息,根本不落地,没有存储。如果说跟数据库扯上半点关系,顶多是用来做日志备份用的。


设计 IM 程序的时候不要扯上数据库概念。一般的小办公室OA也许可以随便拿数据库sql语句编程就当作你的简单逻辑程序了,但是真正的即时通讯设计逻辑怎么可能“奢侈地”纠结很多无关的概念呢?消息就是从一个客户端到另外一个客户端,这个过程中跟数据库没有关系。 --------------------编程问答-------------------- 我倒啊。。。
我现在具体搞不懂的问题就是:一个客户端发出的信息,另外一个客户端是怎么能访问到的?
打个比方,A用户与服务器建立了长连接,B用户向服务器发出了信息,现在的问题是A用户如何通过服务器获得B用户发出的信息啊?
引用 18 楼  的回复:
http://blog.maartenballiauw.be/post/2011/11/29/Techniques-for-real-time-client-server-communication.aspx
类似原理~

http://geekswithblogs.net/jeroenb/archive/2011/12/14/signalr-starter-application.asp……
--------------------编程问答-------------------- https://github.com/SignalR/SignalR/wiki/QuickStart-Persistent-Connections
你照这个写,自然就明白咯。(内部的原来还是要好好看他的WIKI)

就接收消息的实现来说,关注这段
Javascript + HTML 这段就是咋个实现的方法。

...接收到消息就设置前台组件
 connection.received(function (data) {
          $('#messages').append('<li>' + data + '</li>');
      });
有些东西说一堆,还是不清楚,直接自己照例子写写,自己也就感悟了。
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,