思路与技术
本实例添加了私聊功能,有关Application对象的应用如下。
Application对象是建立在应用程序级上并为所有客户提供共享信息的对象。该对象所存储的信息可以被多个客户使用,并且在整个Web应用程序运行期间持久地保存。一个客户停止了自己的应用程序,释放了Application对象的共享信息后,并不影响其他客户应用。
1.变量定义
Application对象的主要功能就是为Web应用程序提供全局变量。它是由用户根据需要自行定义的。其语法格式如下:
Application["变量名"]=表达式;
2.信息读取
应用程序中可以通过给定的变量名读取指定变量的值。其语法格式如下:
变量名=Application["变量名"];
3.Application对象的Lock方法
由于多个用户可以共享Application对象,因此对共享资源使用锁定是必要的。用户可使用该对象的Lock方法禁止其他用户修改Applicaation对象的属性,以确保在同一时刻只有一个客户可以修改和存取Applicaation对象的属性,该方法称为“加锁”。其语法格式如下:
Application.Lock( );
4.Application对象的Unlock方法
如果将共享区加锁后,迟迟不给开锁,可能会产生严重后果。用户可以使用该对象的Unlock方法来解除锁定。这样可以保证在没有程序访问的情况下允许有一个客户可以使用Application对象的共享区,该方法称为“解锁”。其语法格式如下:
Application.Unlock( );
5.Application对象的事件
Applicaation对象具有两个事件:Application_Start事件和Application_End事件。这两个事件的处理程序都放在当前解决方案根目录下的Global.asax文件中。
Application_Start事件是在首次创建新的会话之前发生。当Web服务器启用并允许客户访问后,第一位连入网站的Web用户将触发该事件。在该事件下主要是对一些全局变量做初始化工作。
Application_End事件是在用户退出Web应用程序且在所有的会话都过期后发生。在该事件下主要是对一些关键的Application对象全局变量做适当处理,例如重要的数据存盘等。
下面重点讲解实现私聊与公聊的区别。
在开发聊天室时,实现公聊和私聊的相同点是:都需要保存4项内容,即发送时间、发送者、接收者和聊天内容。发送时间可以直接用系统时间DateTime.Now来表示,发送者可以从Session[“user”]中获取。
其不同点如下。
实现公聊可将这4项内容保存在同一个Application对象中,保存的格式为:发送者、接收者、发送内容、发送时间,并将多条内容以“,”隔开。在显示界面中,直接从Application对象中将保存的内容按顺序一条一条读出来。
而实现私聊时,需要将这4项内容分别保存在4个不同的Application对象中,并确保保存的顺序一致,例如“A对B说你好!”,如果发送者A在Application对象的第一位保存,则其发送内容“你好!”、发送时间“系统时间”、接收者“B”都应保存在相应的Application对象的第一位。在显示聊天内容时,将保存聊天信息的4个Application对象分别存放在4个数组中。对于接收者来说,应将Session[“user”]的值与接收者数组中的值一一对比,如果相同,则记下接收者在数组中的位置,分别将存在该位置中的发送者、发送时间、聊天内容取出来,显示在界面中。
开发步骤
(1)新建一个网站,命名为Ex11_11,默认主页名为Default.aspx。
(2)在页Default.aspx中添加1个Table表格,用来布局页面,在Table表格中添加1个TextBox控件,用户可以在此控件输入用户名,在该表格中再添加1个Button控件,用户通过单击该控件进入聊天室。
(3)创建1个新页left.aspx,用来显示在线用户的列表。在该页中添加1个Table表格,用来布局页面,在Table表格上添加1个ListBox控件用来显示在线用户名。
(4)创建1个新页right.aspx,用来显示聊天信息。在该页中添加1个Table表格,布局页面。在Table表格中添1个TextBox控件,用于显示公聊信息。
(5)创建1个新页Bottom.aspx,添加聊天信息。在该页中添加1个Table表格,用来布局页面,在Table表格添加1个TextBox控件,用户可以在此控件添加聊天信息,再添加2个Button按钮控件,分别用来发送聊天信息和退出聊天室。
(6)主要程序代码。
由于该聊天室是应用Application对象实现的,当服务器重新启动后,Application对象中的数据将全部清空,因此在应用程序启动时,应对数据进行初始化操作,其主要代码如下:
void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
//建立用户列表
string user="";//用户列表
Application["user"] = user;
Application["userNum"] = 0;
string chats = "";//聊天记录
Application["chats"] = chats;
//当前的聊天记录数
Application["current"] = 0;
}
在添加聊天信息页面Bottom.aspx中,当用户输入聊天信息后,单击【我要发言】按钮,在【我要发言】按钮的Click事件下将要发言的信息、发言人、发言时间保存在Application对象中,其代码如下:
protected void Button1_Click(object sender, EventArgs e)
{
Application.Lock( );
string strTxt = TextBox2.Text.ToString( );
int intChatNum = int.Parse(Application["chatnum"].ToString ( ));
//处理公共聊天内容
int intcurrent = int.Parse(Application["current"].ToString( ));
if (intcurrent == 0 || intcurrent >40)
{
intcurrent = 0;
Application["chats"] =Session["user"].ToString( ) + "对" + DropDownList1.SelectedValue.ToString( ) + "说:" + strTxt.ToString( )+"("+ DateTime.Now.ToString( )+")" ;
}
else
{
Application["chats"] = Application["chats"].ToString( ) + "," + Session["user"].ToString( ) + "对" + Drop DownList1. SelectedValue.ToString( ) + "说:" + strTxt.ToString( ) + "(" + DateTime.Now.ToString( ) + ")";
}
intcurrent +=1;
object obj = intcurrent;
Application["current"] = obj;
Application.UnLock( );
//刷新聊天页面
Response.Write("<script language=javascript>");
Response.Write("this.parent.right.location.reload( )");
Response.Write("</script>");
}
在显示聊天信息页面right.aspx加载时,从Application对象中读取保存的聊天信息,将所有的聊天记录显示在页面中。其代码如下:
protected void Page_Load(object sender, EventArgs e)
{
Application.Lock( );
string OwnerName=Session["user"].ToString( );
if (!IsPostBack)
{
//公聊
int intcurrent = int.Parse(Application["current"].ToString( ));
string strchat = Application["chats"].ToString( );
string[] strchats = strchat.Split(',');
for (int i = (strchats.Length - 1); i >= 0; i--)
{
if (intcurrent == 0)
{
TextBox1.Text =strchats[i].ToString( );
}
else
{
TextBox1.Text = TextBox1.Text + "\n" + strchats[i].ToString( );
}
}
}
Application.UnLock( );
}
(7)在聊天信息页right.aspx中,再添加1个TextBox控件,用来显示私聊信息;在添加聊天信息页Bottom.aspx中,再添加1个CheckBox控件,用来区分聊天信息为私聊还是公聊。
(8)主要程序代码。
为了实现私聊功能,在上述基础上修改Global.axax文件,在文件中加入如下的代码:
void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
//建立用户列表
string user="";//用户列表
Application["user"] = user;
Application["userNum"] = 0;
string chats = "";//聊天记录
Application["chats"] = chats;
//当前的聊天记录数
Application["current"] = 0;
string receive = "";//接受列表
Application["receive"] = receive;
string Owner = "";//发送列表
Application["Owner"] = Owner;
string chat = "";//私聊内容列表
Application["chat"] = chat;
Application["chatnum"] = 0;