基于“推”技术的无刷新聊天室 (转摘)
开发环境:
Windows2003 Sp1 .Net 2.0 VS.net 2005
原理:
使用标准HTTP协议实现,但是聊天主线程SOCKET连接始终保持连接,这样服务器端就可以快速方便的把信息发送到浏览器端。大多数无刷新聊天室都是本原理,比如http://chat.qq.com
HTTP协议的实现:
.net 2.0中包含了一个轻量级的Web Server,本聊天室正是依托这个WebServer,最少实现的代码如下:
![]() |
设计:
| 页面名 | 页面说明 | 参数 | 参数说明 |
| index.html | 聊天首页,作为测试入口,本也非必要 | ||
| chat.html | 聊天室主页面,显示信息,发送信息 | u | 用户名 |
| s.aspx | 以GET方式发送信息 | a | 信息发送方 |
| b | 信息接收方 | ||
| str | 信息文本 | ||
| a.aspx | 显示主线程序,就是这个页面始终保持连接 | u | 当前用户名 |
几个主要页面的大致讲解:
a.aspx:这个页面的连接始终保持,用来实时的显示服务器传送过来的数据,包括:公共信息、聊天信息、用户的进出信息。
这个页面内容包含HTML和Js脚本,html内容直接显示,JS直接执行.比如"<script>window.parent.add('c')</script>",就可以
调用父窗口的add函数(在本例中,add函数用来显示新进聊天室的用户)。
Chat.html:
该页是聊天室的主页面,聊天信息的显示、发送聊天信息以及用来显示在线用户。
界面如下:
![]() |
该页面包含一个表单Form,用来想s.aspx提交一个发送信息的GET请求。
该页面包含2个Ifrmae
一个是a.aspx,上面已经介绍了。
另外一个宽和高都是为0,作为表单Form的提交目标Target,这样提交表单的时候表单所在页面就不刷新了。
源代码中实现功能的部分代码:
1.保持连接不断开
这为无刷新的核心:Response.KeepAlive 设置为true,然后不调用Response.End既可。
2.保存在线用户。
这个功能在a.aspx中实现,如果发生 类似 a.aspx?u=x的请求,就认为新用户进来。
详细参见源代码中的 adduser函数。
本例中使用Hashtable保存:key为用户名,Value为该用户保持的连接的StreamWriter。
3.发送信息
从Hashtable获取发送目的的StreamWriter,直接写入就可以了。
源代码下载(在下面连接上点右键另存为,去掉.gif后缀,rar解开):
http://blog.csdn.net/images/blog_csdn_net/Qqwwee_Com/http.rar.gif
关于示例代码:
需要.net 2.0的运行环境;
只实现了在线用户的通知和发送私聊信息,但实现的并不完美;
推荐的测试方法:启动程序以后会自动启动浏览器,点开几个不同的用户,然后在再2个用户之间发送信息;
不要刷新窗口;新开的聊天窗口不要关闭。



浙公网安备 33010602011771号