风卷残云后
在人生的道路上,我们拾起很多,也丢掉很多,一路走下来,能带走的,却没有什么……
博客园
社区
首页
新随笔
联系
管理
订阅
随笔- 59 文章- 4 评论- 358
用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中。
Hashtable users;
StringCollection chat;
在Global.asax.cs 中声明一个全局的ChatEngine的实例,为chat room中所有users共用:
public
static
UChat.ChatEngine.IChatEngine Engine
=
new
UChat.ChatEngine.ChatEngine();
还有一个JavaScript timer函数用来同步全局变量和页面信息。
function setTimers()
{
timeID
=
window.setTimeout(
"
updateAll()
"
, refreshRate );
}
每一个user都由一个username和一个GUID来唯一标识。
public
void
AddUser(
string
id,
string
user)
{
//
make sure user name does not exist already
if
(
!
UserExists( user ) )
{
//
add user to users list
users.Add( id, user );
//
display a notification message to all users
chat.Add(
this
.MakeServerMessage(
string
.Format(
joinedfmt, user ) ));
}
}
程序运行界面
开始页面显示一些有关当前session的基本信息,比如user number、聊天记录的大小等。用户必须提供用户名才能进入聊天室。点击Login button进入下面的函数:
protected
void
Login(
object
sender, EventArgs e )
{
string
user
=
txtUsername.Text;
if
(
!
ValidateNick( user ) )
return
;
if
( Global.Engine.UserExists( user ) )
{
lblErrorMsg.Text
=
"
A user with this
"
+
"
name already exists, try again.
"
;
return
;
}
Response.Redirect(
"
Server.aspx?action=Login&u=
"
+
user );
}
经过一些简单验证后,通过AddUser函数将用户加到user lists,然后就进入了聊天室页面chat.aspx,这时下面的JavaScript函数就会被执行:
<
script type
=
"
text/javascript
"
>
sniffBrowserType();
//
Shows loading.. screen
showLoadScreen();
//
Set the javascript timer and
//
loads user list and messages
setTimers();
setFocus(
'
mytext
'
);
</
script
>
当用户键入一些信息并回车时,就会调用下面的函数:
<
input type
=
"
text
"
class
=
"
mytext
"
id
=
"
mytext
"
onkeydown
=
"
captureReturn(event)
"
>
//
Capture the enter key on the input box and post message
function captureReturn(
event
)
{
if
(
event
.which
||
event
.keyCode)
{
if
((
event
.which
==
13
)
||
(
event
.keyCode
==
13
))
{
postText();
return
false
;
}
else
{
return
true
;
}
}
}
function postText()
{
rnd
++
;
//
Clear text box first
chatbox
=
getElement(
"
mytext
"
);
chat
=
chatbox.value;
chatbox.value
=
""
;
//
get user GUID from url
userid
=
location.search.substring(
1
, location.search.length );
//
construct Ajax Server URL
url
=
'
Server.aspx?action=PostMsg&u=
'
+
userid
+
'
&t=
'
+
encodeURIComponent(chat)
+
'
&session=
'
+
rnd;
//
Create and set the instance
//
of appropriate XMLHTTP Request object
req
=
getAjax();
//
Update page with new message
req.onreadystatechange
=
function()
{
if
( req.readyState
==
4
&&
req.status
==
200
)
{
updateAll();
}
}
req.open(
'
GET
'
, url,
true
);
req.send(
null
);
}
就这么多,没什么特别的,你可以看源代码,里面有很多注释信息。
结 论
要用Java Applet建一个chat room需要在用户的机器上安装JVM。用ActiveX control存在一些安全问题。而用刚才介绍的AJAX,你却可以轻而易举的创建一个基于HTTP并不需要用户安装任何软件就可以运行的聊天室程序,并且很容易维护。
posted @ 2006-12-19 15:05
loose_went
阅读(2472)
评论(21)
编辑
收藏
所属分类:
01 ASP.NET/AJAX
发表评论
回复
引用
#1楼
2006-12-27 06:45 |
海龙 [未注册用户]
你好,能给我一份源代码吗?hailong.net.vs@hotmail.com
回复
引用
#2楼
2007-01-05 10:51 |
hello4890 [未注册用户]
源代码下载不了,可以给我一份吗?hello4890@yahoo.com.cn
谢谢了!!!
回复
引用
#3楼
2007-01-15 19:46 |
Fengdesudu [未注册用户]
源代码下载不了,能给我发一份吗?kmliguanghua@163.com
谢谢
回复
引用
#4楼
2007-01-16 17:24 |
mic [未注册用户]
我也下载不到。。。你可以email给我吗? micheallim@yahoo.com
回复
引用
#5楼
2007-01-16 17:29 |
mic [未注册用户]
thanks ya.... i already done for download.... for those haven't get it, please sign in first.
回复
引用
#6楼
2007-03-07 23:18 |
scep [未注册用户]
下载代码时要先注册。
回复
引用
#7楼
2007-03-28 14:48 |
PEIRONGHE [未注册用户]
Thank a lot!
回复
引用
#8楼
2007-03-29 11:28 |
beibei [未注册用户]
您好!您能给我一份吗?我的邮件是mfj019@163.com
回复
引用
#9楼
2007-04-09 20:18 |
shilei [未注册用户]
您好!您能给我一份吗?我的邮件是wangshangliulangsl@163.com
回复
引用
#10楼
2007-04-22 15:27 |
soso [未注册用户]
您好!您能给我一份吗?我的邮件是wl-1455@163.com
回复
引用
#11楼
2007-04-24 13:44 |
王臻 [未注册用户]
很想学习一下 能给个代码参考一下 谢谢
wangzhen@redant.com.cn
回复
引用
#12楼
2007-05-03 14:42 |
无忧小子 [未注册用户]
我也想要,我的邮箱:dengde2@163.com
回复
引用
#13楼
2007-05-07 10:14 |
那谁 [未注册用户]
给我个吧,谢谢
gzq_1@163.com
回复
引用
#14楼
2007-05-26 09:38 |
3tion [未注册用户]
你这个聊天室的原理和我初期的想法一样。
现在流行的聊天室都是建立持续的http连接,不缓存Reponse。
让服务端程序做个循环,持续输出信息。
回复
引用
#15楼
2007-07-04 18:36 |
fuyanshan [未注册用户]
能发给我一个源代码吗,小弟感激不尽!
fys.1984@yahoo.com.cn
回复
引用
#16楼
2007-07-29 13:53 |
3ks [未注册用户]
给我个吧,谢谢
spkl44@163.com
回复
引用
#17楼
2007-09-26 18:41 |
mschen [未注册用户]
请给我一份吧,请请
itchenfeng@163.com
回复
引用
查看
#18楼
[
楼主
]2007-10-13 18:17 |
loose_went
已经提供下载地址了啊。如要下载源代码,请到我的网站,地址:
http://www.vczx.com/article/show.php?id=1796
回复
引用
查看
#19楼
2007-12-05 20:54 |
ToBin
这个虽然是个示例,但有很多可取之处!
希望能完善!
回复
引用
#20楼
2008-06-13 11:40 |
杉青 [未注册用户]
很详细,想得到更多类似的知识.
新用户注册
刷新评论列表
标题
姓名
主页
Email
(博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
网站首页
新闻频道
社区
小组
博问
网摘
闪存
找找看
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2008-04-02 07:50 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索
相关文章:
ASP.NET实用技巧(一)
ASP.NET跨页面传值技巧总结
使用Visual Studio2005入门.Net2.0系列视频教程
Microsoft .Net Remoting系列专题之一:.Net Remoting基础篇
jQuery与ASP.NET AJAX可以同时使用吗?
为什么VS08对ASP.NET AJAX的智能提示这么慢?
ASP.NET之父强烈推荐的ASP.NET AJAX著作
ASP.NET之父强烈推荐的ASP.NET AJAX著作
相关链接:
所属分类的其他文章:
ASP.NET中的图片路径问题
用Asp.Net创建基于Ajax的聊天室程序
最新IT新闻:
微型博客Twitter取消IM服务 称其ROI差
用手机聊Gtalk的方法以及应用总结
Google开拓美政府机构市场 微软业务受冲击
消息称苹果正在开发iTunes网络电视
微软周一开电话会议 预计将发布Silverlight2.0
公告
网 名:loose_went
http://www.vczx.com
loose_went.blog.163.com
声明:本博客内所有内容,如没标有转载,则均为原创,采用知识共享组织
署名-非商业性使用-相同方式共享 2.5
进行许可授权。
随笔分类
(60)
01 ASP.NET/AJAX(2)
(rss)
02 C#/.NET(17)
(rss)
03 XML/数据库
(rss)
04 Design&Pattern(3)
(rss)
05 软件工程/项目管理
(rss)
06 IT大杂烩(31)
(rss)
07 英语学习(7)
(rss)
C#/.Net学习
01 Visual Studio .NET 2003 Automation Samples
02 CodeProject
03 ScottGu's Blog
04 Xml.org
架构设计&项目管理
01 UML官方网站
02 软件工程专家网
03 UML软件工程组织
数据库学习
01 The Oracle PL/SQL CD Bookshelf
02 Oracle9i Database Online Documentation
积分与排名
积分 - 51755
排名 - 859
最新随笔
1. [转]应用软件系统架构设计的“七种武器”
2. 归纳一下:C#线程同步的几种方法
3. 测试一下你对IP地址的掌握水平(网管面试时会用到)
4. 程序员最后可能的出路
5. 比尔·盖茨的9条忠告
6. [转]如果你出现这十种迹象,你就该跳槽了
7. ASP.NET中的图片路径问题
8. [转]经典正则表达式
9. .NET发邮件错误之"Could not access 'CDO.Message' object."
10. 英语词组日常积累
最新评论
1. re: [转]如果你出现这十种迹象,你就该跳槽了
@小眼睛老鼠
这不能怪你,有些公司招聘的时候说的天花乱坠的,招进来之后就不兑现了。还有更很的,招的时候招一大批,实际可能只需几个,然后实习结束之前把那些排上前几名的统统解雇。 (loose_went)
2. re: [转]如果你出现这十种迹象,你就该跳槽了
有些公司不一样
算是目光短浅吧 (小眼睛老鼠)
3. re: [转]如果你出现这十种迹象,你就该跳槽了
@小眼睛老鼠
恭喜老兄终于找到合适的工作。正常来讲,公司应该不鼓励加班。 (loose_went)
4. re: [转]如果你出现这十种迹象,你就该跳槽了
还好 这边可以不用加班
而且也会给足够的时间给我完成项目
而且这边很注重沟通
不像那边莫名其妙的就被告了一状 (小眼睛老鼠)
5. re: [转]如果你出现这十种迹象,你就该跳槽了
那老兄现在可否找到了心仪的雇主? (loose_went)
6. re: [转]如果你出现这十种迹象,你就该跳槽了
@随心所欲 完全不是这样的,你可以回家睡觉? 找出问题,告诉领导需要延迟以及愿意就是“告状”?你的理解我觉得很偏激。 你列举了很多理由:你希望什么东西别人都准备好给你,让你有充分的时间做完;... (小眼睛老鼠)
7. re: [转]如果你出现这十种迹象,你就该跳槽了
@随心所欲
你既然觉得你有能力
你就把你应对这种事情的具体方法说出来
别说提高能力也不给出提高能力的方法
说白了也就会说而已 (小眼睛老鼠)
8. re: [转]如果你出现这十种迹象,你就该跳槽了
@随心所欲 首先希望你看完再说话没看完没有发言权 是重复的工作 不是重复的内容 代码很少变 但是界面经常变 前台的不断变化不断修改 占用了大量的事情 我先前好像也说过时改界面上的描述之内的占用的大量... (小眼睛老鼠)
9. re: [转]如果你出现这十种迹象,你就该跳槽了
孰能生巧,巧能变化。如果不加班加点,怎么能学到更多东西呢,既然知道是重复,为什么不想办法解决?写个工具之类的。 按你的说法我完全可以安心的睡觉 到时候老板催起来我就先一步告状就可以了 -----... (随心所欲)
10. re: [转]如果你出现这十种迹象,你就该跳槽了
@随心所欲 好像不是的吧 我说无论如何锁定为负面人物是因为上级不关心事实 不关心过程 加班仅仅是我解决问题的方法而已 你在哪儿看我抱怨过加班 我只是说因为加班换来能力不行的评价,不值得 因为加班在别人... (小眼睛老鼠)
阅读排行榜
1. C#委托之个人理解(5289)
2. C#事件(event)解析(4932)
3. C#中有关string和byte[]转换的问题(4557)
4. 如何在C#中使用全局鼠标、键盘Hook(2876)
5. C#学习之接口(2781)
6. 用Asp.Net创建基于Ajax的聊天室程序(2472)
7. 归纳一下:C#线程同步的几种方法(2440)
8. .Net中消除Dll中的dependency(2430)
9. [转]如果你出现这十种迹象,你就该跳槽了(1781)
10. 为什么要学Win32及Win32程序框架(1320)
评论排行榜
1. 如何在C#中使用全局鼠标、键盘Hook(57)
2. [转]如果你出现这十种迹象,你就该跳槽了(46)
3. C#委托之个人理解(38)
4. C#事件(event)解析(25)
5. 用Asp.Net创建基于Ajax的聊天室程序(21)
6. 归纳一下:C#线程同步的几种方法(20)
7. C#中有关string和byte[]转换的问题(13)
8. .Net中消除Dll中的dependency(11)
9. C#学习之接口(9)
10. [转]震动中国人的台湾校长演讲(5)