下面是我写的聊天室的部分代码,设计器自动产生的代码我没有粘贴。
//Global.asax类里的代码
public class Global : System.Web.HttpApplication
{
//这里声明了一个全局的DataTable,用来保存所有用户的聊天记录
public static DataTable m_Talks;
//用来保存聊天室内所有在线用户信息的DataTable
public static DataTable m_Customers;
protected void Application_Start(Object sender, EventArgs e)
{
//在m_Talks中创建三个列
m_Talks = new DataTable("Talks");
//dcFrom保存发言者姓名
DataColumn dcFrom = new DataColumn("From", System.Type.GetType("System.String"));
m_Talks.Columns.Add(dcFrom);
//dcTo保存对话者姓名
DataColumn dcTo = new DataColumn("To", System.Type.GetType("System.String"));
m_Talks.Columns.Add(dcTo);
//dcSaid保存发言内容
DataColumn dcSaid = new DataColumn("Said", System.Type.GetType("System.String"));
m_Talks.Columns.Add(dcSaid);
//在m_Customers中创建一个列
m_Customers = new DataTable("Customers");
DataColumn dcName = new DataColumn("Name", System.Type.GetType("System.String"));
m_Customers.Columns.Add(dcName);
}
}
//Talk.aspx页面的代码,Talk.aspx页面是位于底部框架的发言页面
public class Talk : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Label Label1;
protected System.Web.UI.WebControls.DropDownList DDL_Users;
protected System.Web.UI.WebControls.Label Label2;
protected System.Web.UI.WebControls.TextBox TB_Said;
protected System.Web.UI.WebControls.Button Btn_Say;
public static String m_sCustomerName; //用来保存当前用户的姓名
//将用户发言保存到m_Talk里的私有函数
private int AddToTalks(String From, String To, String Said)
{
if (Global.m_Talks != null)
{
//如果m_Talk里保存的发言多于20条,将最早保存的一条删去。
if (Global.m_Talks.Rows.Count >= 20)
{
Global.m_Talks.Rows.Remove(Global.m_Talks.Rows[0]);
}
DataRow dr = Global.m_Talks.NewRow();
dr["From"] = From;
dr["To"] = To;
dr["Said"] = Said;
Global.m_Talks.Rows.Add(dr);
return Global.m_Talks.Rows.Count - 1;
}
else
{
return -1;
}
}
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if (!this.IsPostBack)
{
DDL_Users.Items.Clear();
DDL_Users.Items.Add("所有人");
//将m_Customers中保存的所有在线用户姓名添加到选择对话者列表框中
for (int i = 0; i <= Global.m_Customers.Rows.Count - 1; i++)
{
DDL_Users.Items.Add(Global.m_Customers.Rows[i]["Name"].ToString());
}
}
}
//发言按钮单击事件
private void Btn_Say_Click(object sender, System.EventArgs e)
{
//将当前用户的发言添加到m_Talks中
if (AddToTalks(m_sCustomerName, DDL_Users.SelectedValue.ToString(), TB_Said.Text) >= 0)
{
TB_Said.Text = "";
}
}
}
//Show.aspx页面的代码,Show页面是位于顶部框架的显示所有用户发言的页面
public class Show : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if (!this.IsPostBack)
{
//给LoadShow.aspx页面的公共静态变量赋值,以便LoadShow页面能访问本页面的属性,方法
LoadShow.m_ShowPage = this;
}
}
}
//LoadShow.aspx页面的代码,LoadShow.aspx是位于一个隐藏的框架内的,用于刷新Show.aspx页面中发言内容的页面
public class LoadShow : System.Web.UI.Page
{
protected System.Timers.Timer timer1;
public static Page m_ShowPage;
private int m_nRowNum = 0;
//将发言者、对话者、发言合并成“XXX 对 XXX 说:。。。。。”这种形式
private String MakeWord(String From, String To, String Said)
{
String sWord;
if (To.Equals(""))
{
sWord = From + " 说:" + Said;
}
else
{
sWord = From + " 对 " + To + " 说:" + Said;
}
return sWord;
}
//Timer1组件的Elapsed事件,每隔一秒刷新一次Show.aspx页面的发言内容
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if ((Global.m_Talks.Rows.Count > m_nRowNum))
{
//问题出在这里,m_ShowPage.Response.IsClientConnected的值总为false。不知道该如何使Show.aspx页面的Response保持连接状态
if ((m_ShowPage != null) && (m_ShowPage.Response != null) && (m_ShowPage.Response.IsClientConnected))
{
String sFrom = Global.m_Talks.Rows[m_nRowNum]["From"].ToString();
String sTo = Global.m_Talks.Rows[m_nRowNum]["To"].ToString();
String sSaid = Global.m_Talks.Rows[m_nRowNum]["Said"].ToString();
String sWord = MakeWord(sFrom, sTo, sSaid);
m_ShowPage.Response.Write(sWord + "<br>\n");
m_ShowPage.Response.Flush;
m_nRowNum ++;
}
}
}
}
//Global.asax类里的代码
public class Global : System.Web.HttpApplication
{
//这里声明了一个全局的DataTable,用来保存所有用户的聊天记录
public static DataTable m_Talks;
//用来保存聊天室内所有在线用户信息的DataTable
public static DataTable m_Customers;
protected void Application_Start(Object sender, EventArgs e)
{
//在m_Talks中创建三个列
m_Talks = new DataTable("Talks");
//dcFrom保存发言者姓名
DataColumn dcFrom = new DataColumn("From", System.Type.GetType("System.String"));
m_Talks.Columns.Add(dcFrom);
//dcTo保存对话者姓名
DataColumn dcTo = new DataColumn("To", System.Type.GetType("System.String"));
m_Talks.Columns.Add(dcTo);
//dcSaid保存发言内容
DataColumn dcSaid = new DataColumn("Said", System.Type.GetType("System.String"));
m_Talks.Columns.Add(dcSaid);
//在m_Customers中创建一个列
m_Customers = new DataTable("Customers");
DataColumn dcName = new DataColumn("Name", System.Type.GetType("System.String"));
m_Customers.Columns.Add(dcName);
}
}
//Talk.aspx页面的代码,Talk.aspx页面是位于底部框架的发言页面
public class Talk : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Label Label1;
protected System.Web.UI.WebControls.DropDownList DDL_Users;
protected System.Web.UI.WebControls.Label Label2;
protected System.Web.UI.WebControls.TextBox TB_Said;
protected System.Web.UI.WebControls.Button Btn_Say;
public static String m_sCustomerName; //用来保存当前用户的姓名
//将用户发言保存到m_Talk里的私有函数
private int AddToTalks(String From, String To, String Said)
{
if (Global.m_Talks != null)
{
//如果m_Talk里保存的发言多于20条,将最早保存的一条删去。
if (Global.m_Talks.Rows.Count >= 20)
{
Global.m_Talks.Rows.Remove(Global.m_Talks.Rows[0]);
}
DataRow dr = Global.m_Talks.NewRow();
dr["From"] = From;
dr["To"] = To;
dr["Said"] = Said;
Global.m_Talks.Rows.Add(dr);
return Global.m_Talks.Rows.Count - 1;
}
else
{
return -1;
}
}
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if (!this.IsPostBack)
{
DDL_Users.Items.Clear();
DDL_Users.Items.Add("所有人");
//将m_Customers中保存的所有在线用户姓名添加到选择对话者列表框中
for (int i = 0; i <= Global.m_Customers.Rows.Count - 1; i++)
{
DDL_Users.Items.Add(Global.m_Customers.Rows[i]["Name"].ToString());
}
}
}
//发言按钮单击事件
private void Btn_Say_Click(object sender, System.EventArgs e)
{
//将当前用户的发言添加到m_Talks中
if (AddToTalks(m_sCustomerName, DDL_Users.SelectedValue.ToString(), TB_Said.Text) >= 0)
{
TB_Said.Text = "";
}
}
}
//Show.aspx页面的代码,Show页面是位于顶部框架的显示所有用户发言的页面
public class Show : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if (!this.IsPostBack)
{
//给LoadShow.aspx页面的公共静态变量赋值,以便LoadShow页面能访问本页面的属性,方法
LoadShow.m_ShowPage = this;
}
}
}
//LoadShow.aspx页面的代码,LoadShow.aspx是位于一个隐藏的框架内的,用于刷新Show.aspx页面中发言内容的页面
public class LoadShow : System.Web.UI.Page
{
protected System.Timers.Timer timer1;
public static Page m_ShowPage;
private int m_nRowNum = 0;
//将发言者、对话者、发言合并成“XXX 对 XXX 说:。。。。。”这种形式
private String MakeWord(String From, String To, String Said)
{
String sWord;
if (To.Equals(""))
{
sWord = From + " 说:" + Said;
}
else
{
sWord = From + " 对 " + To + " 说:" + Said;
}
return sWord;
}
//Timer1组件的Elapsed事件,每隔一秒刷新一次Show.aspx页面的发言内容
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if ((Global.m_Talks.Rows.Count > m_nRowNum))
{
//问题出在这里,m_ShowPage.Response.IsClientConnected的值总为false。不知道该如何使Show.aspx页面的Response保持连接状态
if ((m_ShowPage != null) && (m_ShowPage.Response != null) && (m_ShowPage.Response.IsClientConnected))
{
String sFrom = Global.m_Talks.Rows[m_nRowNum]["From"].ToString();
String sTo = Global.m_Talks.Rows[m_nRowNum]["To"].ToString();
String sSaid = Global.m_Talks.Rows[m_nRowNum]["Said"].ToString();
String sWord = MakeWord(sFrom, sTo, sSaid);
m_ShowPage.Response.Write(sWord + "<br>\n");
m_ShowPage.Response.Flush;
m_nRowNum ++;
}
}
}
}
浙公网安备 33010602011771号