asp.net基于WEB的客户及时通信,信息的传输问题,,急,,急

likf521 2009-12-19 10:10:15
一般实现网上会话聊天,一般思路都是通过AJAX进行数据库访问,但是我现在不要总是频繁访问数据库,减轻服务器端压力。


我要实现的是,两个用户,一个客服人员与客户进行问题会话,,他们两个之间的会话信息,用缓存保存,隔多少时间,把他们之间聊天记录存储到数据库,在删除缓存前面的聊天记录。。。不从数据库中,没说一句话,就存一次数据库,
那用session去保存信息,那他们之间的会话信息,改怎么去及时更新了···
请各位大侠帮帮忙··


很急的一个项目··这个问题卡死我了··
...全文
130 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
woainipau 2011-12-16
  • 打赏
  • 举报
回复
你就是个新手 鉴定完毕 打字的时间都可以做个了
likf521 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lijing3333 的回复:]
可以用 Application 对象.. 不存数据库
C# code//Global.asax配置protectedvoid Application_Start(object sender, EventArgs e)
{//创建Application对象 Application["name"]=new List<string>();
Application["SenDMsg"]=new List<string>();
}//登录页protectedvoid Page_Load(object sender, EventArgs e)
{if(!IsPostBack)
{//BindToListBox(); }
}protectedvoid Button1_Click(object sender, EventArgs e)
{//取得用户名 任意输入 Session["name"]= TextBox1.Text;//Application构造泛型集合 List<string> list= (List<string>)Application["name"];//当前泛型添加用户名称 list.Add(Session["name"].ToString());//更新好的泛型 再次存取 Application 得到所有 登录名 Application["name"]= list;//转到聊天页面 Response.Redirect("WebForm1.aspx");
}//聊天页面protectedvoid Page_Load(object sender, EventArgs e)
{if (!IsPostBack)
{//没有用户名 非法登录 返回登陆页if (Session["name"]==null)
{
Response.Redirect("Default.aspx");return;
}//当前我自己的ID名字 Label1.Text= Session["name"].ToString();
BindToListBox();
BindToDrop();
BinderMsgToTxt();
}
}protectedvoid Button1_Click(object sender, EventArgs e)
{//用户 注销推出 放弃会话 并删除Application["name"]里面自己的名字 List<string> list= (List<string>)Application["name"];
list.Remove(Session["name"].ToString());
BindToListBox();
Session["name"]=null;
Session.Abandon();if (Session["name"]==null)
Response.Redirect("Default.aspx");
Response.End();
}privatevoid BindToListBox()
{//所有姓名绑定到ListBox List<string> list= (List<string>)Application["name"];
ListBox1.DataSource= list;
ListBox1.DataBind();
}privatevoid BindToDrop()
{//绑定所有姓名到DropDownList 让用户选择跟谁对话 List<string> list= (List<string>)Application["name"];
DropDownList1.DataSource= list;
ListItem oneList=new ListItem();
oneList.Text= list[0].ToString();
oneList.Value= list[0].ToString();
DropDownList1.DataBind();
}protectedvoid Button2_Click(object sender, EventArgs e)
{
SendMsg();
BinderMsgToTxt();
}privatevoid SendMsg()
{//发送消息 给Application["SenDMsg"]对象 存入的消息 List<string> list= (List<string>)Application["SenDMsg"];string SendName= DropDownList1.SelectedValue.ToString();string SendMsg= TextBox2.Text;
list.Add(Session["name"].ToString()+"对"+ SendName+"说:"+"<b>"+ SendMsg+"</b>"+"\n\r");
Application["SenDMsg"]= list;// Response.Write(DropDownList1.SelectedValue.ToString()); }privatevoid BinderMsgToTxt()
{//循环 取出Application["SenDMsg"] 数据 给textbox 页面显示 TextBox1.Text="";
List<string> list= (List<string>)Application["SenDMsg"];for (int i=0; i< list.Count; i++)
{
TextBox1.Text+= list[i].ToString();
}
}
思路  通过2个Application对象 1个保存session的名字 1个保存 聊天消息. 
然胡把Application里面的数据添加到页面去 不同的session给同一个Application
插入数据 那么就可以聊天了 如果想页面不刷新 还要加入ajax可设定X秒 来更新页面数据
发送按钮的时候页面也会自动的进行更新 我这个是写的一个简单的 还可以加个判断
Application数据过多 进行清空
[/Quote]


能告诉我缓存加缓存依赖实现更新,并且存储到数据库中嘛?|
likf521 2009-12-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sp1234 的回复:]
解决所谓缓存的误解之后,对于基于http的通讯协议:

一方面,定时获取消息可能并不慢。虽然有人可能说http比tcp/udp慢5倍,但是这是基于特意设计的简单服务而进行的所谓测试。对于真正的服务,http短连接机制很可能更能支持更多的用户的“准”实时通讯。

另一方面,如果确实要求超高要求,而可以牺牲web服务器的高负载能力,那么可以采取http长连接方式,既服务器在接收到ajax查询时在相当长时间内一直不回应,直到有了消息才回应。这样,客户端就可以立刻得到返回消息而不用等到下次轮询时。
[/Quote]


缓存哪里我开始说明时候出错了``我是说先用缓存建个虚拟的表(当然数据库中也建有相应的实体表),用ajax实现每隔多少时间把虚拟表中数据保存到数据库,,但是要怎么样实现虚拟表中数据交互??
likf521 2009-12-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cyhcyhhychyc 的回复:]
flash可以及时更新的,这也是为什么我推荐你用的原因。因为,flash是以插件的形式装在浏览器上的,相当于在客户端装了个软件,这样,服务器可以直接主动的向浏览器发信息。理解我的意思了么?“主动”,这就保证了及时更新。普通的b/s程序,只能由客户端主动发起会话,这样当然无法保证及时取的消息了。你要知道,你和对方聊天,对方什么时候有消息到了服务器,你的浏览器是一无所知的,只有在请求服务器里才能查询,?-
[/Quote]
我下载了一个flash,,但是到底怎么用,,他都有个局限限,你可以教我怎么用吗??我以前真的没用,,我QQ330902221
  • 打赏
  • 举报
回复
解决所谓缓存的误解之后,对于基于http的通讯协议:

一方面,定时获取消息可能并不慢。虽然有人可能说http比tcp/udp慢5倍,但是这是基于特意设计的简单服务而进行的所谓测试。对于真正的服务,http短连接机制很可能更能支持更多的用户的“准”实时通讯。

另一方面,如果确实要求超高要求,而可以牺牲web服务器的高负载能力,那么可以采取http长连接方式,既服务器在接收到ajax查询时在相当长时间内一直不回应,直到有了消息才回应。这样,客户端就可以立刻得到返回消息而不用等到下次轮询时。
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cyhcyhhychyc 的回复:]
flash可以及时更新的,这也是为什么我推荐你用的原因。因为,flash是以插件的形式装在浏览器上的,相当于在客户端装了个软件,这样,服务器可以直接主动的向浏览器发信息。理解我的意思了么?“主动”,这就保证了及时更新。普通的b/s程序,只能由客户端主动发起会话,这样当然无法保证及时取的消息了。你要知道,你和对方聊天,对方什么时候有消息到了服务器,你的浏览器是一无所知的,只有在请求服务器里才能查询,?-
[/Quote]

怎样发,有具体根据吗?

很简单地用例条件:在互联网上,我在单位办公室里,在单位的ADSL路由器以及网关后面,能说出flash是怎么支持服务器直接发数据的实际机制吗?
  • 打赏
  • 举报
回复
所谓缓存就是对数据库的内存影像,而你不把数据写入数据库那么还叫缓存吗?

真正的缓存数据是将数据立刻写入数据库(当然如果要求降低一点可以异步写入),同时在内存中也保存一份副本,这才是缓存。
cyhcyhhychyc 2009-12-20
  • 打赏
  • 举报
回复
flash可以及时更新的,这也是为什么我推荐你用的原因。因为,flash是以插件的形式装在浏览器上的,相当于在客户端装了个软件,这样,服务器可以直接主动的向浏览器发信息。理解我的意思了么?“主动”,这就保证了及时更新。普通的b/s程序,只能由客户端主动发起会话,这样当然无法保证及时取的消息了。你要知道,你和对方聊天,对方什么时候有消息到了服务器,你的浏览器是一无所知的,只有在请求服务器里才能查询,哦,原因对方发消息过来了,然后再下载。flash就相反了,有消息到服务器,它直接给你发到客户端了,你说能不及时么?具体怎么做就是你的事啦
cyhcyhhychyc 2009-12-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sp1234 的回复:]
解决所谓缓存的误解之后,对于基于http的通讯协议:

一方面,定时获取消息可能并不慢。虽然有人可能说http比tcp/udp慢5倍,但是这是基于特意设计的简单服务而进行的所谓测试。对于真正的服务,http短连接机制很可能更能支持更多的用户的“准”实时通讯。

另一方面,如果确实要求超高要求,而可以牺牲web服务器的高负载能力,那么可以采取http长连接方式,既服务器在接收到ajax查询时在相当长时间内一直不回应,直到有了消息才回应。这样,客户端就可以立刻得到返回消息而不用等到下次轮询时。
[/Quote]
可能的东西,猜测的东西就不要一再重复了。你没有经过验证怎么就把事实都颠倒过来了?http相比于udp做实时通讯是慢,这是与生俱来的,还需要继续讨论么?长连接再长也得响应吧,信息频率快,你的长连接的短脚就出来了。flash游戏是怎么做的,都用长连接?那不是想死了?人家网页游戏有好的体验就说明了人家的实时性。
我不知道的就不说,知道的就说出来。不存在“误人子弟”之嫌,因为本人也是菜鸟,本着互相帮助的精神知无不言,言无不尽。聊天室本人也做过,用的是最笨的高频请求方式,效果当然是不行的。不尽是实时性不大好,而且造成浏览器压力比较大。flash聊天室有不少网友做过,当时收录了不少,只不过因为系统重装都丢了,记得有个imoliao的,现在好像关了,没有人气。
可以参考一下:http://www.cnblogs.com/beniao/archive/2009/02/17/1355911.html
flash对付一个小小的聊天室,功能是不容置疑的,更不要说去作实时会议视频等系统了。我对flash了解不多,只不过当初做聊天室考虑了这个方向就看了一些,我估计它的原理是建立一个不断的连接,这样当然就可以实时了。听说过vpn么,类似了。不多说了,要做的话自己多看看了,别人当然只是点一下而已,更何况我本身也了解不多。
lijing3333 2009-12-19
  • 打赏
  • 举报
回复
可以用 Application 对象.. 不存数据库

//Global.asax配置
protected void Application_Start(object sender, EventArgs e)
{
//创建Application对象
Application["name"] = new List<string>();
Application["SenDMsg"] = new List<string>();
}

//登录页
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
//BindToListBox();
}
}

protected void Button1_Click(object sender, EventArgs e)
{
//取得用户名 任意输入
Session["name"] = TextBox1.Text;
//Application构造泛型集合
List<string> list = (List<string>)Application["name"];
//当前泛型添加用户名称
list.Add(Session["name"].ToString());
//更新好的泛型 再次存取 Application 得到所有 登录名
Application["name"] = list;
//转到聊天页面
Response.Redirect("WebForm1.aspx");
}

//聊天页面
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//没有用户名 非法登录 返回登陆页
if (Session["name"] == null)
{
Response.Redirect("Default.aspx");
return;
}
//当前我自己的ID名字
Label1.Text = Session["name"].ToString();
BindToListBox();
BindToDrop();
BinderMsgToTxt();
}
}

protected void Button1_Click(object sender, EventArgs e)
{
//用户 注销推出 放弃会话 并删除Application["name"]里面自己的名字
List<string> list = (List<string>)Application["name"];
list.Remove(Session["name"].ToString());
BindToListBox();
Session["name"] = null;
Session.Abandon();
if (Session["name"] == null)
Response.Redirect("Default.aspx");
Response.End();
}

private void BindToListBox()
{
//所有姓名绑定到ListBox
List<string> list = (List<string>)Application["name"];
ListBox1.DataSource = list;
ListBox1.DataBind();
}

private void BindToDrop()
{
//绑定所有姓名到DropDownList 让用户选择跟谁对话
List<string> list = (List<string>)Application["name"];
DropDownList1.DataSource = list;
ListItem oneList = new ListItem();
oneList.Text = list[0].ToString();
oneList.Value = list[0].ToString();
DropDownList1.DataBind();
}

protected void Button2_Click(object sender, EventArgs e)
{
SendMsg();
BinderMsgToTxt();
}

private void SendMsg()
{
//发送消息 给Application["SenDMsg"]对象 存入的消息
List<string> list = (List<string>)Application["SenDMsg"];
string SendName = DropDownList1.SelectedValue.ToString();
string SendMsg = TextBox2.Text;
list.Add(Session["name"].ToString() + "对" + SendName + "说:" + "<b>" + SendMsg + "</b>" + "\n\r");
Application["SenDMsg"] = list;
// Response.Write(DropDownList1.SelectedValue.ToString());
}

private void BinderMsgToTxt()
{
//循环 取出Application["SenDMsg"] 数据 给textbox 页面显示
TextBox1.Text = "";
List<string> list = (List<string>)Application["SenDMsg"];
for (int i = 0; i < list.Count; i++)
{
TextBox1.Text += list[i].ToString();
}
}

思路 通过2个Application对象 1个保存session的名字 1个保存 聊天消息.
然胡把Application里面的数据添加到页面去 不同的session给同一个Application
插入数据 那么就可以聊天了 如果想页面不刷新 还要加入ajax可设定X秒 来更新页面数据
发送按钮的时候页面也会自动的进行更新 我这个是写的一个简单的 还可以加个判断
Application数据过多 进行清空
likf521 2009-12-19
  • 打赏
  • 举报
回复
如果各位大侠,,手中有同类型的案例,,希望能共享下,真的急需啊··
likf521 2009-12-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cyhcyhhychyc 的回复:]
这个及时更新的问题应该用flash做就不是问题了
[/Quote]

这个flash能保证会话信息及时更新?如果用session可能会出现数据丢失问题,,我该怎么解决了·
还有更好的解决方案吗???
各位,还多帮助解决下·谢谢了·
cyhcyhhychyc 2009-12-19
  • 打赏
  • 举报
回复
这个及时更新的问题应该用flash做就不是问题了

62,254

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧