首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 客户端如何自动获取服务器端的数据 [已结贴,结贴人:hancs]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hancs
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-05-10 16:03:59 楼主
    我的毕业设计需要实现这样的要求,当服务器上的数据表有新内容时候,客户端就刷新页面,否则就一直是原来旧的页面,这改怎么实现啊?
    我在GOOGLE上查了许久没有信息啊。大家有没有什么好的想法?
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • LoveCherry
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 4

    发表于:2008-05-10 16:09:051楼 得分:0
    客户端怎么知道服务端有新数据了?
    要么meta里面refresh整页定时刷新
    要么js做settimeout定时从服务端加载最新数据
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yeness
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-10 16:13:112楼 得分:0
    0_0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zengxie
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-10 16:19:473楼 得分:5
    用AJAX定时去搜数据库,如果有更新就更新,在每次提数据时在另一张表改变下最后更新的时间,然后选择大于这个时间的数据,你去下个聊天时的程序,上面回有的
    http://www.51aspx.com上下个AJAX聊天室的程序
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sxlfybb
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-10 16:26:534楼 得分:0
    引用 1 楼 LoveCherry 的回复:
    客户端怎么知道服务端有新数据了?
    要么meta里面refresh整页定时刷新
    要么js做settimeout定时从服务端加载最新数据
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hancs
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-10 16:45:205楼 得分:0
    服务器上的更新间隔时间是不定时的,定时刷新不行,比如一个视频还没有播放完毕,时间到刷新又重播了
    AJAX聊天室的程序对防火墙没有关系吧,能过去的吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tautaulee
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-10 16:46:346楼 得分:5
    AJAx定时刷新。!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hancs
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-10 17:04:017楼 得分:0
    不能定时的,服务器上的数据更新时不定时的
    我的一个基本想法时这样的,在主要页面上显示当前的数据,比如正在播放的AVI或者其他文本,
    在这个主页面上嵌入一个iframe窗体,这个窗体定时刷新自己,当有数据的时候,刷新母页面,
    具体实现还不清楚,不知道这个想法可行不?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zengxie
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-10 19:09:058楼 得分:5
    不定时没法取,你要知道B/S结构的程序的特点,你只能一秒钟去取一次,最好的是用AJAX
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zengxie
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-10 22:17:119楼 得分:15


    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="ChatRoom.aspx.cs" Inherits="regUser_ChatRoom" CodePage="936" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>MovieOnline聊天室 </title>
        <script type="text/javascript">
          function send()
          {
              var txtContent = document.all("content").value; //文本框输入内容
              if (txtContent == "") return;
              var user_to = document.all("userlist").value;
              var isPublic = !(document.all("isSecret").checked);
              regUser_ChatRoom.SendMsg(txtContent,user_to,isPublic);
             
              var div = document.all("chatcontent");
              div.innerHTML = div.innerHTML + regUser_ChatRoom.getNewMsg().value;
              document.all("content").value = "";
          }
          function refresh_chatcontent()
      {
      //调用服务器方法获取最新消息的HTML字符串
      var div = document.all("chatcontent");
      var strNewMsg = regUser_ChatRoom.getNewMsg().value;
     
      //判断是否为空,避免不必要的更新
      if (strNewMsg != "")
        div.innerHTML = div.innerHTML+strNewMsg;
       
      //定时更新
      window.setTimeout(refresh_chatcontent, 3000);
      }
      function refresh_onlineusers()
      {
      //发送对象列表
      var userlist = document.all("userlist");
     
      //调用服务器端方法获取用户列表字符串(用逗号分隔)
      var strUserlist = regUser_ChatRoom.GetOnlineUserString().value;
     
      //获取客户端显示的用户列表字符串
      var strUserlistClient = "";
      for (var i = 1;i < userlist.options.length;i++)
      {
        if (i != userlist.options.length - 1)
        {
        strUserlistClient += userlist.options[i].value + ",";
        }
        else
        {
        strUserlistClient += userlist.options[i].value;
        }
      }
     
      if (strUserlistClient != strUserlist)  //在线用户列表发生变化
      {
        var userArr = strUserlist.split(',');
       
        //在线用户数
        var usercount = document.all("usercount");
        usercount.innerHTML = "在线名单:(" + userArr.length + "人)";
       
        //左边用户列表
        var tableHTML = " <table>";
        for (var i = 0;i < userArr.length;i++)
        {
        tableHTML += " <tr> <td> <label onmouseover=\"this.style.cursor='hand'\" onmouseout=\"this.style.cursor='default'\" onclick=\"setObj('" + userArr[i] + "')\">" + userArr[i] + " </label> </td> </tr>";
        }
        tableHTML += " </table>";
        var div = document.all("onlineusers");
        div.innerHTML = tableHTML;
       
       
        //初始化
        while (userlist.options.length > 0)
        {
        userlist.removeChild(userlist.options[0]);  //清空所有选项
        }
       
        //增加“所有的人”选项
        var oOption = document.createElement("OPTION");
        oOption.text = "所有的人";
        oOption.value = "大家";
        userlist.add(oOption);
       
        //下拉列表中增加在线用户的选项
        for (var i = 0;i < userArr.length;i++)
        {
        var oOption = document.createElement("OPTION");
        oOption.text = userArr[i];
        oOption.value = userArr[i];
        userlist.add(oOption);
        }   
      } 
     
      //每隔1秒更新
      window.setTimeout(refresh_onlineusers, 3000);
      }
      function setObj(str)
      {
      var userlist = document.all("userlist");
      for (var i = 0;i < userlist.options.length;i++)
      {
        if (str == userlist.options[i].value)
        {
        userlist.selectedIndex = i;
        break;     
        }
      }
      }
        </script>

        <link href="../css/pub.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <TABLE id="Table1" height="90%" cellSpacing="0" cellPadding="0" width="100%" border="0">
        <TR>
        <TD style="FONT-SIZE: 12px" vAlign="top" width="150" background="../Images/onlinebg.jpg"> <br>
          <br>
          <div id="usercount"> </div>
          <div id="onlineusers"> </div>
        </TD>
        <TD vAlign="top" background="../Images/bgbrick.gif">
          <table width="100%">
          <tr>
            <td align="left" style="FONT-WEIGHT: bold; FONT-SIZE: 18px; COLOR: #337755; FONT-FAMILY: 宋体, Arial">
            <br>
            MovieOnline聊天室欢迎你!
            <hr>
            </td>
          </tr>
          <tr>
            <td vAlign="top" height="575">
            <div id="chatcontent" style="OVERFLOW-Y: scroll;WIDTH: 100%; POSITION: relative; HEIGHT: 100%; color: blue;" align="left"> </div>
            </td>
          </tr>
          </table>
        </TD>
        </TR>
        <TR height="65">
        <TD bgColor="#0099cc" align="center" valign="middle">
        <label onmouseover="this.style.cursor='hand'" onmouseout="this.style.cursor='default'" onclick="document.all('chatcontent').innerHTML = ''" style="FONT-SIZE:14px;FONT-WEIGHT: bold; COLOR: #ffcc00; TEXT-ALIGN: center">清空屏幕 </label>
        <br>
        <label onmouseover="this.style.cursor='hand'" onmouseout="this.style.cursor='default'" onclick="if (confirm('您确定要退出该聊天室吗?')) Close();" style="FONT-SIZE:14px;FONT-WEIGHT: bold; COLOR: #ffcc00; TEXT-ALIGN: center">退出聊天 </label>
        </TD>
        <TD style="FONT-SIZE: 13px" align="center" background="../Images/chatformbg.jpg">
          聊天对象:
          <SELECT style="FONT-SIZE: 12px" name="userlist">
          <OPTION value="大家" selected>所有的人 </OPTION>
          </SELECT>
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;
          <INPUT id="isSecret" type="checkbox" name="isSecret">密谈
          <br>
          <INPUT id="content" onkeydown="if (event.keyCode == 13) {send();return false;}" type="text"
          maxLength="100" size="70" name="content"> <INPUT id="btnSend" onclick="send();return false;" type="button" value="发送" name="btnSend">
        </TD>
        </TR>
      </TABLE>
        </div>
        <script language="javascript">
      refresh_chatcontent();
      refresh_onlineusers();
      </script>
        </form>
    </body>
    </html>
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zengxie
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-10 22:18:2010楼 得分:15
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    using System.Configuration;

    public partial class regUser_ChatRoom : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Ajax.Utility.RegisterTypeForAjax(typeof(regUser_ChatRoom));
        }
        [Ajax.AjaxMethod()]
        public void SendMsg(string content,string User_to,bool isPublic)
        {
            string User_from = "zengxie";
            DataVisit dv = new DataVisit();
            dv.SendMsg(User_from, content, User_to, isPublic);
        }
        [Ajax.AjaxMethod()]
        public string getNewMsg()
        {
            string name = "zengxie";
            string MsgHTML="";
            DataVisit dv = new DataVisit();
            SqlDataReader sdr = dv.getNewMsg(name);
                while (sdr.Read())
                {
                    if (sdr.GetString(1) != "")
                    {
                        MsgHTML += String.Format(sdr.GetString(1)+"对"+sdr.GetString(2)+"说:  "+sdr.GetString(3))+" <br>";
                    }
                }
            setLastInfo(name);
            return MsgHTML;
        }
        public void setLastInfo(string name)
        {
            DataVisit dv = new DataVisit();
            dv.setLastChatInfo(name);
        }
        [Ajax.AjaxMethod()]
        public string GetOnlineUserString()
        {
            string strUserlist = "";

            SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MovieConnectionString"].ToString());
            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "GetOnlineUsers";
            conn.Open();
            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                while (dr.Read())
                {
                    strUserlist += dr.GetString(1) + ",";
                }
            }
            conn.Close();
            return strUserlist.TrimEnd(',');
        }
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wangsaokui
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-10 22:20:0611楼 得分:5
    http协议因为不是长连接,所以没有办法实现callback,上面的都说了解决的办法(就是定时去读取),我这里只是解释原因。

    或者可以做一个ActiveX和后台保持联系。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zengxie
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-10 22:29:1812楼 得分:0


    ALTER PROCEDURE [dbo].[setLastChatInfo]
    @username varchar(50)
    AS
    update ChatUser set LastChatInfo = (select max(ID) from ChatMsg) where UserName=@username


    ALTER PROCEDURE [dbo].[getNewMsg]
    @username varchar(50)
    AS
    DECLARE @LastID int
    SET @LastID = (select LastChatInfo from ChatUser where UserName=@username)


    select * from ChatMsg where (ID > @LastID) and ((IsPublic='True') or (User_to=@username) or (User_from=@username) or (User_to='大家')) AND ( sendtime > GETDATE() - '00:05:00' )



    public SqlDataReader getNewMsg(string name)
        {
            SqlConnection con= new SqlConnection(ConfigurationManager.ConnectionStrings["MovieConnectionString"].ToString());
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.Parameters.Add("@username", name);
            cmd.CommandText = "getNewMsg";
            cmd.CommandType = CommandType.StoredProcedure;
            con.Open();
            SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            return sdr;

        }
        public void setLastChatInfo(string name)
        {
            SqlConnection con= new SqlConnection(ConfigurationManager.ConnectionStrings["MovieConnectionString"].ToString());
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.Parameters.Add("@username", name);
            cmd.CommandText = "setLastChatInfo";
            cmd.CommandType = CommandType.StoredProcedure;
            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();
        }
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved