基于“推”技术的无刷新聊天室 (转摘)

开发环境:

    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个用户之间发送信息;

不要刷新窗口;新开的聊天窗口不要关闭。

posted @ 2007-06-14 11:55  海底的鱼  阅读(327)  评论(0)    收藏  举报