在同一个系统中,前台用户发送一条信息,如何在后台不需要刷新页面自动弹出消息?
例如CSDN中有这种消息机制,qq也一样 请问如何实现?   
不知道形容清楚没有 请教各位高手

解决方案 »

  1.   

    asp.net b/s数据库去读的话无法实现即使消息,需要刷新页面,如果数据很频繁就麻烦了
      

  2.   

    ajax 局部定时刷新,还是要刷新的 从 web 服务的角度 只有 客户端 向服务器端 提出 请求 才可以 ,哪有服务器主动向 客户端发消息的呀
      

  3.   

    ajax每秒刷新。或者指定秒刷新。
      

  4.   

    c/s 使用socket技术,利用tcp或udp协议
    在System.Net.Sockets下有相关类库
      

  5.   

    那这是以个网页来实现的,你不可能让别装桌面软件吧live800 你们用过没有?
    也是用网页来实现聊天的,但他们的服务端是c/s软件,不知道全部用b/s能行不?
      

  6.   

    b/s當然可以。
    大致的思路是:每隔一斷時間訪問服務器看是否有新留言。有的話就取出來。
    1. 使用ajax框架
    2. 如果javascript水平OK,就自己寫腳本訪問服務器,性能有比較大的提升空間。有人說定時刷新,如果你要求不高且訪問量不大,也是可以的。
      

  7.   

    c/s的肯定是直接发送消息到目的地,b/s的一般是ajax,读相应的库吧
      

  8.   

    刚做了一个
    JS + AJAX 不用刷数据库,自己写个类,类成员都是静态变量,当发布新消息时 改变类里面的值 前台页面 定时刷新那个类 速度挺快的  抛开数据库了当然在发布信息时 改变类的值后也可以插入数据库 作为信息历史记录
      

  9.   

    用Application啊,应用程序集内部共享数据,可以实现即时获取信息的功能。不过这样内存会占用比较大。建议存前N条数据。
      

  10.   

    真搞...b/s服务端是不能主动跟客户端通信的.必须由客户端先发起请求.26楼和21楼的方法结合起来才能达到你要的效果,并且将对服务器的性能影响降到最低.做成 Ajax <-- 数据缓存类 <-- 数据库 这样的结构.页面通过Ajax定时访问数据缓存类,包括写入和读取,效率可以不用担心,就算设置成每秒刷新,对服务器性能也不会有太大影响,但是要注意多线程同时写的情况.采用合适的数据结构才是需要考虑的问题.前台后台都通过这个类来访问数据.数据缓存类定时将更新写入数据库,可以最小化访问数据库的次数和开销.没什么难点.非常常用的做法.
      

  11.   

    建立TCP监听的方式,你看看MSN就是这样的,当你打开一个好友的对话窗口是就建立了有个监听(服务端是固定的端口,CLIENT端是随机的端口)
      

  12.   

    42楼说的原理应该就是一般c/s聊天的原理。我以前写过一个,每个客户端登陆服务器后打开一个udp通道,把ip和端口注册到数据库中,另外一个客户端登陆要和这个客户端通讯的话,先从数据库中查到ip和端口,用udp往这个ip和端口发消息,每个客户端都有一个udpclient在监听这个端口读取消息,读到消息就可以执行定制的操作,如果双方都是公网的话,除了开始查询对方ip和端口外,服务器可以不用参与双方得通讯。
    写这个要考虑到一方或是双方不是公网的情况,就是那种一个路由器一个ip带好几台机器的情况,默认情况下你是不可能向这种不是公网的机器发消息的,你就必须考虑穿透,建议使用udp而不使用tcp,原因是udp穿透比较简单。udp穿透网上有很多文章介绍。
      

  13.   

    不用监听~发送消息给WebService,触发Ajax生成提示页面.
      

  14.   

    [size=11px][/size]
      

  15.   

    B/S是无法做到真正意义上的及时消息的,因为B/S是使用http协议,由客户端发起的,除非你让这个请求一直保持连接,或者在B/S中嵌入其他插件
      

  16.   

    真的只能做成ajax每隔几秒提取一次数据?
    那要是客户端多了得站多少资源啊?
      

  17.   

    如果不用数据库的话,可以用端口通迅的方式,如用SOCKETJS组件等,不过难度过大!
      

  18.   

    b/s的话.用ajax每隔一秒扫一次..有新消息弹出..像这样:function fasf()
    {
       
    getDatas();
    setTimeout("fasf()",40000)
    }
    function getDatas()
    {
        userid=Form1.userid.value;
        if (userid !="" && userid !=null)
        {
       var x=new ActiveXObject("Microsoft.XMLHTTP");
               x.open("post","message/listentop2.aspx",false);
               x.send('<?xml version="1.0" ?><Root><Userid>'+userid+'</Userid></Root>');
               if (x.status != 200)
               {
                  alert(x.statusText);
               }
               else
               {
            
                   eval(x.responseText); 
               }
            }         
        }
      

  19.   

    看样子只能用ajax来顶替如此通信消息了,
    忽悠一下他们,估计是看不出破绽的
      

  20.   

    FluorineFx
    可以实现.net remoting 瘦客户端
    http://www.fluorinefx.com/docs/fluorine/index.html 官方网站他的原理也不是简单说明白的,至于tcp/ip做出的东西都需要 跨防火墙
    利用ajax实现异步提交,暂时是一个比较好的解决方案(比较简单么)
      

  21.   

    这种通信属于remoting吗?
    大哥你这是全英文的哦  #_!
      

  22.   

    典型的TCP(或UDP)利用Socket套接字客户端与服务器端相互通讯的应用
    用System.Net.Sockets.TcpListener 构建TcpListener对象 
    然后Start()方法建立监听...
    下列代码创建了一个 TcpListener。
    using System;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;class MyTcpListener
    {
      public static void Main()
      { 
        TcpListener server=null;   
        try
        {
          // 设置端口为 13000 的 TcpListener。
          Int32 port = 13000;
          IPAddress localAddr = IPAddress.Parse("127.0.0.1");
          
          // TcpListener server = new TcpListener(port);
          server = new TcpListener(localAddr, port);      // 为客户端请求启动监听。
          server.Start();
             
          // 为读取数据而准备缓存
          Byte[] bytes = new Byte[256];
          String data = null;      // 进入监听循环。
          while(true) 
          {
            Console.Write("Waiting for a connection... ");
            
            // 完成一个阻塞调用来接受请求。
            // 你同样可以在这里使用 AcceptSocket()。
            TcpClient client = server.AcceptTcpClient();            
            Console.WriteLine("Connected!");        data = null;        // 获取一个数据流对象来进行读取和写入
            NetworkStream stream = client.GetStream();        int i;        // 循环接收客户端所发送的所有数据。
            while((i = stream.Read(bytes, 0, bytes.Length))!=0) 
            {   
              // 把数据字符转化成 ASCII 字符串。
              data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
              Console.WriteLine("Received: {0}", data);
           
              // 处理客户端所发送的数据。
              data = data.ToUpper();          byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);          // 回发一个请求。
              stream.Write(msg, 0, msg.Length);
              Console.WriteLine("Sent: {0}", data);            
            }
             
            // 关闭并且结束连接
            client.Close();
          }
        }
        catch(SocketException e)
        {
          Console.WriteLine("SocketException: {0}", e);
        }
        finally
        {
           // 停止监听新的客户端。
           server.Stop();
        }      
        Console.WriteLine("\nHit enter to continue...");
        Console.Read();
      }   
    }
      

  23.   

    触发器?
    但我记得sql的触发器没法触发asp.net执行程序吧
      

  24.   


    你说的" Ajax  <-- 数据缓存类"是指通过异步访问webservice或webform来操作System.Web.Caching.Cache类么?web下的多线程的应用一直很棘手,不知如何下口,你有没有相关收藏的文章实例之类的么?
      

  25.   

    去看看Socket吧。C#有支持Socket的,google一下
      

  26.   

    个人感觉定时刷新是可行的·B/S 就是一个请求/反应模式,服务端无法控制客户端的刷新,
    只需在客户端用个JS刷新显示窗口部分即可,
      

  27.   

    需要做的是服务器接收到消息后发给另外一个客户端怎么想都很难实现,这就是b/s 无法替代c/s 的原因?一定要顶出高手来.
      

  28.   

    B/S的服务端是不能主动联系客户端的,不是一个长连接啊,不知道active行不行,对这个不了解