关于无刷新技术聊天室,怎么实现?

kension 2005-11-21 10:45:56
在网上找了很久,觉得讲得不是很清楚,请各位做过的给一点经验及思路,谢谢!
...全文
577 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
losingrose 2005-11-22
  • 打赏
  • 举报
回复
ajax技术,微软专门成立了研究小组atlas
利用web服务+js胖客户端实现无刷新技术,进行后台数据传输,我也正要用这个技术做个聊天室,目前只有最新版的VS2005支持这个编辑.

--------------------------------------------------------------
NeT(Nebula Team)
成都理工学生求兼职
MSN:losingrose@21cn.com
QQ技术群7019839
4329478
iuhxq 2005-11-22
  • 打赏
  • 举报
回复
建立Default.aspx
<%@ Page language="c#" Codebehind="Default.aspx.cs" AutoEventWireup="false" Inherits="Chat._Default" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title></title>
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
<LINK href="style.css" type="text/css" rel="stylesheet">
</HEAD>
<body onunload="exit();" MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<table height="400" cellSpacing="0" cellPadding="0" width="600" bgColor="#f0f0f0" border="0">
<tr>
<td height="21">
<div align="right"><IMG height="21" src="Images/left_02.gif" width="533"></div>
</td>
</tr>
<tr>
<td>
<table height="370" cellSpacing="0" cellPadding="0" width="600" align="center" bgColor="#000000"
border="0">
<tr bgColor="#ffffff">
<td width="50"><IMG height="27" hspace="5" src="images/img01.gif" width="30" vspace="2"></td>
<td class="14font" width="542">您好,欢迎光临客服在线答疑!如果您有什么问题或是建议,请直接与我们的客服人员联系。
</td>
</tr>
<tr bgColor="#ffffff">
<td background="images/img07.gif" colSpan="2" height="1"><FONT face="宋体">
<div id="list">在线客服列表:<asp:repeater id="Repeater1" runat="server">
<ItemTemplate><input type="button" value="<%# DataBinder.Eval(Container.DataItem, "Name")%>" <%# (DataBinder.Eval(Container.DataItem, "ToSID")!=null && DataBinder.Eval(Container.DataItem, "ToSID").ToString().Length>0)? "disabled":""%> onclick="login('<%# DataBinder.Eval(Container.DataItem, "SID")%>');">
</ItemTemplate>
</asp:repeater></div>
</FONT>
</td>
</tr>
<tr bgColor="#ffffff">
<td colSpan="2" height="23">
<div id="log" style="OVERFLOW: auto; WIDTH: 600px; WORD-BREAK: break-all; HEIGHT: 310px"><FONT face="宋体"></FONT><br>
</div>
</td>
</tr>
<tr bgColor="#ffffff">
<td colSpan="2">
<div id="s" style="DISPLAY: none"><INPUT id="content" onkeydown="if(event.keyCode==13){Send('',document.getElementById('content').value);return false;}"
type="text" maxLength="200" size="80" name="text"> <INPUT id="send" onclick="Send('',document.getElementById('content').value);" type="button"
value="发送" name="button">
</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
<script language="javascript">
var count = 0;
var lid = -1;

GetLog();

function GetLog()
{
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.load('GetLog.aspx?lid='+lid);
var nodes = xmlDoc.documentElement.childNodes;
for (i=0;i<nodes.length;i++)
{
lid = nodes[i].childNodes[0].text;
var str = '';
switch(nodes[i].childNodes[6].text)
{
case "login":
continue;
case "exit": case "stop":
if (nodes[i].childNodes[1].text == sid)
{
continue;
}
alert('客服已经结束会话!');
window.close();
return ;
default:
if (nodes[i].childNodes[1].text == sid)
{
str = "我 对 " + nodes[i].childNodes[4].text + " 说:<font color=#3366CC>" +nodes[i].childNodes[6].text+"</font>("+nodes[i].childNodes[5].text+")<br/>";
}
else
{
str = nodes[i].childNodes[2].text+" 对 我 说:<font color=blue>" +nodes[i].childNodes[6].text+"</font>("+nodes[i].childNodes[5].text+")<br/>";
count = 0;
}
log.innerHTML += str;
}
}
log.scrollTop = 9999;
}

function Send(action, content)
{
if(action.length<1 && content.length<1)
{
alert('请输入您的交谈内容');
return;
}
if (count>3&&action!="exit")
{
alert('您说的太快了,喝杯茶休息一下吧!');
return ;
}
count++;
var Body = 'action='+action+'&content='+content;
var xml = new ActiveXObject("Microsoft.XMLHTTP");
xml.open("POST",'chat.aspx',false);
xml.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
xml.setRequestHeader("Content-Length",escape(Body).length)
xml.send(Body);
document.getElementById('content').value = "";
}
function login(sid)
{
Send("login", sid);
list.style.display='none';
s.style.display = '';
setInterval(GetLog, 5000);
}
function exit()
{
Send("exit", "");
}
</script>
</form>
</body>
</HTML>
Default.aspx.cs
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面

Response.Write("<script language='javascript'>var sid = '"+Session.SessionID+ "';</script>");
Repeater1.DataSource = MyUser.GetAllUser();
Repeater1.DataBind();
}
iuhxq 2005-11-22
  • 打赏
  • 举报
回复
建立GetLog.aspx
<%@ Page language="c#" Codebehind="GetLog.aspx.cs" AutoEventWireup="false" Inherits="Chat.GetLog" %><?xml version="1.0" encoding="utf-8" ?>
<Log>
<asp:Repeater id="Repeater1" runat="server">
<ItemTemplate><item>
<id><%# DataBinder.Eval(Container.DataItem, "id")%></id>
<from><%# DataBinder.Eval(Container.DataItem, "from")%></from>
<fromname><%# DataBinder.Eval(Container.DataItem, "fromname")%></fromname>
<to><%# DataBinder.Eval(Container.DataItem, "to")%></to>
<toname><%# DataBinder.Eval(Container.DataItem, "toname")%></toname>
<SendTime><%# DataBinder.Eval(Container.DataItem, "SendTime")%></SendTime>
<content><%# DataBinder.Eval(Container.DataItem, "content")%></content>
</item></ItemTemplate>
</asp:Repeater>
</Log>

GetLog.aspx.cs
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
Response.ContentType = "text/xml";
Response.Expires = -1;
Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1);
Response.CacheControl = "no-cache";


int lid = int.Parse(Request["lid"]);

Repeater1.DataSource = Log.GetLog(lid);
Repeater1.DataBind();
}
iuhxq 2005-11-22
  • 打赏
  • 举报
回复
1、建立chat项目
2、
Global.aspx.cs文件
protected void Application_Start(Object sender, EventArgs e)
{
ArrayList users = new ArrayList();
Application["users"] = users;
ArrayList admins = new ArrayList();
Application["admins"] = admins;
ArrayList Logs = new ArrayList();
Application["logs"] = Logs;
}
建立Log.cs
using System;
using System.Web;
using System.Collections;

namespace Chat
{
/// <summary>
/// Log 的摘要说明。
/// </summary>
public class Log
{

const int CacheLen = 5000;
public Log()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

#region 属性
private int _ID;
public int ID
{
get
{
return _ID;
}
set
{
_ID = value;
}
}

private string _From;
public string From
{
get
{
return _From;
}
set
{
_From = value;
}
}

private string _FromName;
public string FromName
{
get
{
return _FromName;
}
set
{
_FromName = value;
}
}

private string _To;
public string To
{
get
{
return _To;
}
set
{
_To = value;
}
}

private string _ToName;
public string ToName
{
get
{
return _ToName;
}
set
{
_ToName = value;
}
}

private string _Content;
public string Content
{
get
{
return _Content;
}
set
{
_Content = value;
}
}

private DateTime _SendTime;
public DateTime SendTime
{
get
{
return _SendTime;
}
set
{
_SendTime = value;
}
}

#endregion

#region 方法
/// <summary>
/// 插入聊天记录
/// </summary>
/// <param name="action"></param>
/// <param name="content"></param>
public static void InsertLog(string action, string content)
{
string sid = HttpContext.Current.Session.SessionID;
MyUser user = MyUser.GetUser();
switch (action)
{
case "stop":
if (user.SID == sid)
{
InsertLog("", "stop");
MyUser.Stop();
}
return;
case "exit":
InsertLog("", "exit");
MyUser.Logout();
return;
case "login":
MyUser.Login(content);
InsertLog("", "login");
return;
}

content = HttpContext.Current.Server.HtmlEncode(content);
HttpContext.Current.Application.Lock();
ArrayList logs = (ArrayList)HttpContext.Current.Application["logs"];

int id = -1;
if(logs.Count>0)
{
id = ((Log)logs[logs.Count-1]).ID;
}
id++;


Log log = new Log();
log.ID = id;
log.From = sid;
log.To = (user.SID == sid)? user.ToSID : user.SID;
log.FromName = (user.SID == sid)? user.Name : user.ToName;
log.ToName = (user.SID == sid)? user.ToName : user.Name;
log.SendTime = DateTime.Now;
log.Content = content;

logs.Add(log);

if(logs.Count>CacheLen)
{
logs.RemoveRange(0, logs.Count-CacheLen);
}
HttpContext.Current.Application["logs"] = logs;
HttpContext.Current.Application.UnLock();
}

/// <summary>
/// 查询聊天记录
/// </summary>
/// <param name="lid"></param>
/// <returns></returns>
public static ArrayList GetLog(int lid)
{
string sid = System.Web.HttpContext.Current.Session.SessionID;
MyUser user = MyUser.GetUser();

HttpContext.Current.Application.Lock();
ArrayList logs = (ArrayList)HttpContext.Current.Application["logs"];
HttpContext.Current.Application.UnLock();

if(logs.Count>0)
{
if(user == null || user.ToSID == sid)//普通用户
{
ArrayList newlogs = new ArrayList();
for(int i = 0;i<logs.Count;i++)
{
if( ((Log)(logs[i])).ID > lid && (((Log)(logs[i])).From == sid || ((Log)(logs[i])).To == sid))
{
newlogs.Add((Log)logs[i]);
}
}
return newlogs;
}
else//客服
{
for(int i = 0;i<logs.Count;i++)
{
if(((Log)logs[i]).ID>lid)
{
return logs.GetRange(i, logs.Count-i);
}
}
}
}
return null;
}
#endregion
}
}
txdil 2005-11-22
  • 打赏
  • 举报
回复
喂,
如果学会了
教教我!!!
在下万分感激。。。。
机器人 2005-11-22
  • 打赏
  • 举报
回复
用ajax不错。我前一阵写了一个,我的思路是:

1. 使用ajax定期刷新局部区域(聊天区域,用户列表),我现在是每隔5秒刷新一次。
2. 本来想用Cache的,可惜ajax.net还不支持Cache,所以改用直接读取数据库。
3. 在Session里保持上次查询聊天记录的Timespan,然后每条聊天记录有sequence区别,
因为ajax.net可以操作Session,所以每次查询的,都是上次查询到这次查询两次之间
的所有聊天记录。sequence是为了避免不必要的刷新聊天区域。
4. ajax的使用,增加了我在aspx里javascript的代码量。尤其对聊天区域的刷新,我使用
对<Table></Table>区域,insertRow, insertCell的方法进行。


223344 2005-11-22
  • 打赏
  • 举报
回复
我也需要一个
moodboy1982 2005-11-22
  • 打赏
  • 举报
回复
大家都是用javascript xmlhttp web service
不过,我也试过。
BossFriday 2005-11-21
  • 打赏
  • 举报
回复
你查找一下有关推技术的文章.全的代码,我也找不到.
基于推技术的聊天室就是你想要的东西.
clxxj 2005-11-21
  • 打赏
  • 举报
回复
xmlhttp+javascript
也可以关注一下AJAX,这是一种潮流.
hexinyu2005 2005-11-21
  • 打赏
  • 举报
回复
使用web service + js 脚本实现无刷新。
newthunder 2005-11-21
  • 打赏
  • 举报
回复
使用web service + js 脚本实现无刷新。
  • 打赏
  • 举报
回复
ajax
blackhero 2005-11-21
  • 打赏
  • 举报
回复
javascript xmlhttp web service
ajax
冰河绝恋 2005-11-21
  • 打赏
  • 举报
回复
楼上都学会了就没有问题

62,074

社区成员

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

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

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

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