开发者社区> 橘子红了呐> 正文

用Asp.Net创建基于Ajax的聊天室程序

简介:
+关注继续查看
原作者Dahan Abdo
译自CodeProject 

如要下载源代码,请到我的网站,地址:http://www.vczx.com/article/show.php?id=1796

简 介

  我的第一个chat room 是用ASP 3.0写的。 程序比较简单,两个text box, 用来处理页面上每秒刷新的信息。那时候,要想建一个真正的chat room,要用到Java Applet 或者 ActiveX control。基于HTTP的chart rooms都面临着一些跟我第一个chat room一样的问题。这些问题包括页面刷新导致的屏幕闪烁现象。但这个问题已经被AJAX解决了。 AJAX是JavaScript和 XML异步调用的结合。现在在server端用一些JavaScript代码就可以实现一个真正的chat room了。这篇文章不会介绍Ajax,并假设你已经对Ajax和ASP.NET的运用有一定了解。只是介绍如何用Ajax技术来创建一个基本的chat room。

例 程

  这是一个多用户的单一chat room。可以实现基本的聊天功能,还支持一些命令行如: /admin clear 用来清除聊天记录,/nick [Name] 用来更改用户昵称等。程序说明这个程序用一个ChatEngine类来处理所有的聊天信息和用户信息,用户信息存储在一个Hashtable中,聊天信息存储在StringCollection中。 

None.gifHashtable users;
None.gifStringCollection chat;

  在Global.asax.cs 中声明一个全局的ChatEngine的实例,为chat room中所有users共用: 

None.gifpublic static UChat.ChatEngine.IChatEngine Engine = new UChat.ChatEngine.ChatEngine();
None.gif

  还有一个JavaScript timer函数用来同步全局变量和页面信息。 


None.giffunction setTimers()
ExpandedBlockStart.gif
{
InBlock.gif  timeID 
= window.setTimeout( "updateAll()", refreshRate );
ExpandedBlockEnd.gif}

每一个user都由一个username和一个GUID来唯一标识。 

None.gifpublic void AddUser(string id, string user)
ExpandedBlockStart.gif
{
InBlock.gif      
//make sure user name does not exist already
InBlock.gif
      if!UserExists( user ) )
ExpandedSubBlockStart.gif      
{
InBlock.gif            
//add user to users list
InBlock.gif
            users.Add( id, user );
InBlock.gif                                    
InBlock.gif            
//display a notification message to all users 
InBlock.gif
            chat.Add( this.MakeServerMessage(string.Format(
InBlock.gif                      joinedfmt, user ) ));
ExpandedSubBlockEnd.gif      }

ExpandedBlockEnd.gif}

None.gif

程序运行界面
 


  开始页面显示一些有关当前session的基本信息,比如user number、聊天记录的大小等。用户必须提供用户名才能进入聊天室。点击Login button进入下面的函数: 

None.gifprotected void Login( object sender, EventArgs e )
ExpandedBlockStart.gif
{
InBlock.gif      
string user = txtUsername.Text;
InBlock.gif
InBlock.gif      
if!ValidateNick( user ) ) return;
InBlock.gif
InBlock.gif      
if( Global.Engine.UserExists( user ) )
ExpandedSubBlockStart.gif      
{
InBlock.gif            lblErrorMsg.Text 
= "A user with this " + 
InBlock.gif                 
"name already exists, try again.";
InBlock.gif            
return;
ExpandedSubBlockEnd.gif      }

InBlock.gif      Response.Redirect( 
"Server.aspx?action=Login&u=" + user );
ExpandedBlockEnd.gif}

  经过一些简单验证后,通过AddUser函数将用户加到user lists,然后就进入了聊天室页面chat.aspx,这时下面的JavaScript函数就会被执行:
 


None.gif<script type="text/javascript">
None.gif      sniffBrowserType();
None.gif      
//Shows loading.. screen
None.gif
      showLoadScreen();
None.gif      
//Set the javascript timer and 
None.gif      
//loads user list and messages 
None.gif
      setTimers();
None.gif      setFocus(
'mytext');
None.gif
</script>

  当用户键入一些信息并回车时,就会调用下面的函数: 

None.gif<input type="text" class="mytext" 
None.gif       id
="mytext" onkeydown="captureReturn(event)">
None.gif
None.gif
// Capture the enter key on the input box and post message
None.gif
function captureReturn( event )
ExpandedBlockStart.gif
{
InBlock.gif      
if(event.which || event.keyCode)
ExpandedSubBlockStart.gif      
{
InBlock.gif            
if ((event.which == 13|| (event.keyCode == 13)) 
ExpandedSubBlockStart.gif            
{
InBlock.gif                  postText();
InBlock.gif                  
return false;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockStart.gif            
else {
InBlock.gif                  
return true;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif      }
     
ExpandedBlockEnd.gif}

None.giffunction postText()
ExpandedBlockStart.gif
{
InBlock.gif      rnd
++;
InBlock.gif      
//Clear text box first
InBlock.gif
      chatbox = getElement( "mytext" );
InBlock.gif      chat 
= chatbox.value;
InBlock.gif      chatbox.value 
= "";
InBlock.gif      
InBlock.gif      
//get user GUID from url
InBlock.gif
      userid = location.search.substring( 1, location.search.length );
InBlock.gif      
InBlock.gif      
//construct Ajax Server URL
InBlock.gif
      url = 'Server.aspx?action=PostMsg&u=' + userid + '&t=' +
InBlock.gif             encodeURIComponent(chat) 
+ '&session=' + rnd;
InBlock.gif      
InBlock.gif      
//Create and set the instance 
InBlock.gif      
//of appropriate XMLHTTP Request      object
InBlock.gif
      req = getAjax();
InBlock.gif      
InBlock.gif      
//Update page with new message
ExpandedSubBlockStart.gif
      req.onreadystatechange = function(){
InBlock.gif      
ExpandedSubBlockStart.gif            
if( req.readyState == 4 && req.status == 200 ) {
InBlock.gif                  updateAll();
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif      }

InBlock.gif      
InBlock.gif      req.open( 
'GET', url, true );
InBlock.gif      req.send( 
null );
ExpandedBlockEnd.gif}

  就这么多,没什么特别的,你可以看源代码,里面有很多注释信息。

结 论

  要用Java Applet建一个chat room需要在用户的机器上安装JVM。用ActiveX control存在一些安全问题。而用刚才介绍的AJAX,你却可以轻而易举的创建一个基于HTTP并不需要用户安装任何软件就可以运行的聊天室程序,并且很容易维护。





   本文转自loose_went博客园博客,原文链接:http://www.cnblogs.com/michaelxu/archive/2006/12/19/596872.html,如需转载请自行联系原作者



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
ASP.NET MVC默认配置如有跳转到指定的Area区域中的对应程序中
ASP.NET MVC默认配置如有跳转到指定的Area区域中的对应程序中
53 0
ASP.NET Core中实现单体程序的事件发布/订阅
ASP.NET Core中实现单体程序的事件发布/订阅 背景# 事件发布/订阅是一种非常强大的模式,它可以帮助业务组件间实现完全解耦,不同的业务组件只依赖事件,只关注哪些事件是需要自己处理的,而不用关注谁来处理自己发布事件,事件追溯(Event Sourcing)也是基于事件发布/订阅的。
1497 0
以Windows服务方式运行ASP.NET Core程序
原文:以Windows服务方式运行ASP.NET Core程序 我们对ASP.NET Core的使用已经进行了相当一段时间了,大多数时候,我们的Web程序都是发布到Linux主机上的,当然了,偶尔也有需求要发布到Windows主机上,这样问题就来了,难道直接以控制台形式运行这个Web程序吗? 直接...
2271 0
一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](三)
前言 上一篇《一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](二)》我们通过如下操作: 创建实体及工具类 创建Repository类 完善View层 修改控制器 创建视图 数据库连接 创建数据库和表 实现了简单的数据库连接及数据查询操作,既然是简单的数据库连接,那我们有必要对它进行进一步的升级、封装。
2389 0
+关注
橘子红了呐
文章
问答
视频
文章排行榜
最热
最新
相关课程
更多
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载
相关实验场景
更多