Asp.net实现即时消息通讯(Ajax)

以下是最近搞的一个用asp.net实现的即时消息的小功能,由于消息的即时性,和网络的无状态无连接。因此曾一时间无法想到很好的解决方法,很多人都说可以使用socket编程来实现使用端口进行点对点即时通信。

可是,暂时没有看到现成实现的例子。于是,我还是使用了像实现简易聊天室那样的方式,使用了一个Application对象,全局维护一个用户消息表来实现从一个客户端到服务器,再从服务器到另一个客户端信息的传递(这也是问题的关键所在,我无法实现不通过服务器,来实现点对点消息的传递,就算是通过了服务器也无法不通过Application这种共享的方式来实现信息的传递)。

主要思路和实现方式如下:发送端:查看是否在线——>发送消息(写入数据库);接收端:

收到消息提示——>查看消息——>回复(写入数据库) or 忽略——>如果有下一条,则重复以上步骤。而最重要的部分:就是接收端如何接收消息,和无论接收端停留在哪个页面上,我们都要有办法来提示用户有新消息(事实上,这是一个OA系统的附带功能,也就是说用户当时可能正在干其他事情,但要有办法让他收到消息提示)。如何接收消息,其实就是一个非常简单的方式,那就是用一个Timer控件,间隔一段时间去Application对象中轮询侦听(这和你定时去刷新的作用差不多),是否有新消息待接收。而想在每个页面上都要实现有新消息就提示,则菜用了Frame的方式,思路很简单。你肯定要在一个全局性的框架页面上去提示用户,同时侦听消息也必须是在内嵌在这个Frame的页面上进行。

好了,下面就是相关示例代码:

首先登陆过后跳转到MainForm.aspx页面(由以下几个框架构成):

<frameset rows="129,*" cols="*" frameborder="NO" border="0" framespacing="0">
<frame src="Top.aspx" mce_src="Top.aspx" name="topFrame" scrolling="NO" noresize>
<frameset cols="250,*" frameborder="NO">
<frame src="Left.aspx" mce_src="Left.aspx" name="leftFrame" scrolling="yes" noresize>
<frameset rows="30,*" frameborder="NO" id="right">
<frame scrolling="no" name="right_topFrame" src="ShowMsg.aspx" mce_src="ShowMsg.aspx" frameborder="0">
<frame src="Choose.aspx" mce_src="Choose.aspx" name="rightFrame" noresize scrolling="yes">
</frameset>
</frameset>
</frameset>
<body>
<noframes>
</noframes>
</body>

其中,name为right_topFrame的Frame则是用来侦听消息的框架页,其他所有页面都是在name为rightFrame的Frame中实现,在此不再多说。

我们在Application对象中维护下面一个用户对象的数组,其中Users.cs如下:

public class Users
{
private string userID;
private string userName;
private bool isOnline;
private StringBuilder message_text;
private DateTime message_time;
private string message_to;
private string message_from;
private Queue message_queue;

public Users(string uid)
{
this.userID = uid;
this.isOnline = false;
message_text = new StringBuilder("");
message_to = userID;
message_from = userID;
//设置一个以前的时间
message_time = Convert.ToDateTime("2000-01-01 00:00:00");
message_queue = new Queue();
Message = new messageInfo(Message_text.ToString(), Message_time,Message_from);
}

//帐号
public string UserID
{
get { return userID; }
set { userID = value; }
}

//姓名
public string UserName
{
get { return userName; }
set { userName = value; }
}

//存储消息
public StringBuilder Message_text
{
get { return message_text; }
set { message_text = value; }
}

//是否在线
public bool IsOnline
{
get { return isOnline; }
set { isOnline = value; }
}

//信息接收者
public string Message_to
{
get { return message_to; }
set { message_to = value; }
}

//信息发送者
public string Message_from
{
get { return message_from; }
set { message_from = value; }
}

//接受信息的时间
public DateTime Message_time
{
get { return message_time; }
set { message_time = value; }
}

//用于接收消息的消息队列
public Queue Message_queue
{
get { return message_queue; }
set { message_queue = value; }
}

//用来存储消息相关信息
public struct messageInfo
{
public string message_text;
public DateTime message_time;
public string message_from;

public messageInfo(string m_text,DateTime m_time, string m_from)
{
message_text = m_text;
message_time = m_time;
message_from = m_from;
}
}

/// <summary>
/// 定义一个消息结构体类型的对象
/// </summary>
public messageInfo Message;
}

为便于访问,我们先从数据库中取得相关用户的id,姓名等信息,在Users数组中对各个User对象进行初始化,为便于以键值对的形式访问,我们先将这个Users数组中的每个元素都存入放在一个以其ID作为key的HashTable中;这些操作都必须在应用程序刚启动时就必须完成,在整个应用程序运行期间,都必须去维护这个用户消息表,所以 Global.asax中Application_Start方法实现如下:

protected void Application_Start(object sender, EventArgs e)
{
Users_DS ds = new Users_DS();
Users_DSTableAdapters.UsersTableAdapter userAda = new IM.Users_DSTableAdapters.UsersTableAdapter();
userAda.FillAll(ds.Users);
int count=ds.Users.Rows.Count;
Common.Users[] users = new Common.Users[count];
Hashtable ht_users = new Hashtable();
for (int i = 0; i < count; i++)
{
users[i] = new Common.Users(ds.Users.Rows[i][0].ToString());
users[i].UserName = ds.Users.Rows[i][1].ToString();
ht_users[users[i].UserID] = users[i];
}
if (Application["Users"] == null)
{
Application["Users"] = ht_users;
}
}

大致原理就是如此。

原文发布时间为:2010-04-05

本文作者:vinoYang

时间: 2024-09-30 05:55:55

Asp.net实现即时消息通讯(Ajax)的相关文章

关于java web 即时消息通讯的实现,求技术推荐。不胜感激!!

问题描述 想用java实现一个web在线的即时通信,目前java在这块有没有比较合适的框架推荐.可以实现点对点和多人一起聊天,我希望支持100人同时在线,比如我有2个页面,当用户进入A页面可以和A页面的用户聊天,进入B页面,可以和B页面的用户聊天.请问java在这方面有什么合适的框架谢谢 解决方案 解决方案二:用dwr实现应该不是太复杂.解决方案三:消息中间件吧,apache的activemq解决方案四:消息的是要即时的,我一发另外个人就要马上收到,或者全部收到解决方案五:DWR实现会不会对性能

利用.net来发送即时消息:)

用了我一下午的时间终于写完并整理好了利用.net来发送即时消息的材料(当然了,还有上午的数据库设计:)    数据库设计:info表:id fromstu_id tostu_id content term其中id是主键,fromstu_id是发送信息的用户的学号(这是和我做的学友录连在一起的),tostu_id是接受信息的用户的学号,content是消息的内容,term是判断是否为新消息.下面的代码家在校友录中的if not ispostback中 '/////////////////////判

.net中即时消息发送的实现……

用了我一下午的时间终于写完并整理好了利用.net来发送即时消息的材料(当然了,还有上午的数据库设计:)    数据库设计:info表:id fromstu_id tostu_id content term其中id是主键,fromstu_id是发送信息的用户的学号(这是和我做的学友录连在一起的),tostu_id是接受信息的用户的学号,content是消息的内容,term是判断是否为新消息.下面的代码家在校友录中的if not ispostback中'/////////////////////判断

网开云办公怎么发送即时消息

  双击好友头像,在弹出的聊天窗口中输入消息,点击"发送",即可向好友发送即时消息.支持快捷回复,自定义表情,屏幕截图,字体设置,图片文件发送等多种功能.如图所示: 文件传送 点击文件传送按钮,可以实现向联系人发送在线文件或离线文件,同时可以在文件管理器中查看相应的发送和接收记录.如图所示: 远程协助 不同用户之间可以利用一技之长通过远程控制技术为远端电脑前的用户解决问题.如图所示: 语音聊天 联系人之间可以通过此功能完成点对点语音通讯,实现了多元化沟通.如图所示:

.net中即时消息发送的实现

用了我一下午的时间终于写完并整理好了利用.net来发送即时消息的材料(当然了,还有上午的数据库设计:) 数据库设计:info表:idfromstu_idtostu_idcontentterm 其中id是主键,fromstu_id是发送信息的用户的学号(这是和我做的学友录连在一起的),tostu_id是接受信息的用户的学号,content是消息的内容,term是判断是否为新消息. 下面的代码家在校友录中的ifnotispostback中 '/////////////////////判断是否有新留言

Hangouts能否挽救谷歌即时消息应用市场

腾讯科技 旻静 5月22日综合报道在今年的谷歌I/O开发者大会上,谷歌推出了全新的即时通讯应用产品Hangouts,支持Android.iOS以及Chrome等多平台.Hangouts沿用了原有Google+视频聊天服务的命名,将统一谷歌具有通讯属性的产品,取代包括Google+ Messager.Google Talk以及原 有的视频聊天服务在内的产品.这次的更新是否可以解决谷歌在即时通讯这块领域常年以来的问题?追溯历史谷歌曾是消息服务的先驱.2005 年,谷歌推出了Google Talk,在

用Dojo迅速搭建基于XMPP的即时消息通信应用

而且,XMPP 包含了针对服务器端的软件协议,使之能与另一个进行通话,这使得开发者能更加容易且更加快速地建立合适的客户应用程序.Dojo 这样一个强大且完善的 Web 开发控件库也针对 XMPP 协议封装了自己的客户端应用接口,基于这些接口,我们可以迅速的搭建自己的http://www.aliyun.com/zixun/aggregation/11030.html">即时消息通信应用的前端.这篇文章将重点介绍 Dojo 的这些 XMPP 接口以及如何用它搭建一个完整的应用. XMPP(Th

中联通“即时通”通讯工具通过测试 面向学生用户

从中国联通内部获悉,其http://www.aliyun.com/zixun/aggregation/34880.html">即时通讯工具暂命名为"即时通",已于8月下旬完成并通过业务测试,即将上线公测.据介绍,"即时通"产品已被中国联通划归为战略 性产品,其运营基地设在中国联通北京1788.html">分公司.2010 年6月,北京联通开始调集产品创新部.网络分公司网管中心.市场部.信息化部.电子渠道中心等相关部 门开发即时通业务.

改写我前面的即时消息的发送,包含同时给多人发送信息!

以前的的发送消息按钮事件改写如下:'/////////////////////转到发送即时消息页面    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click        Dim i, j As Integer        j = 0        Dim tostu_id As String = ""        Fo