好像用corba可以但我不懂
期待。

解决方案 »

  1.   

    to  flylt(淘沙) 
    你比我快!!!7456
      

  2.   

    说到股票交易, 我想来乐, 在《Java2编程详解》中好象举了这么一个例子,client用的是applet, 记得好象用的是socket通信,我猜想应该是server发消息让applet去更新数据。如果是用rmi的话,可以考虑用callback(可能流量比较大:p),也就是说client的界面控制也交给server去做,呵呵 ... 不过应该不会那么变态吧 :)希望哪位高手能停一下手头的工作,给大家讲讲吧,谢谢哦~
      

  3.   

    我觉得这个问题有点怪,client的主控权在谁手中?
    具体这个问题并不难做,来个最笨的方法:定期发请求也可以搞定。如果强调实时相应,则不能使用定期的做法,不知道socket能不能做到。
      

  4.   

    想一下还是不太对,client容易定位server,而server怎么定位每一个client呢?
      

  5.   

    如果定位client 的话,就要有一定的安全性问题
    其实,象oicq那样,在服务器上保存client 的数据(ip &port)
    然后数据更新时由server 连接client ,用socket应该可以解决,不过这样很容易受到攻击
      

  6.   

    在Client端与Server端建立socket连接即可
      

  7.   

    呵呵,参考corba的主动服务器技术,微软在早些年就提出过主动服务器的“推”的概念,正好满足你的需求。agree dynku:服务器端保存客户列表,如有事件发生,主动向客户端发送消息。这也是消息驱动的基本概念。至于安全性,不知道老兄说的是什么?我在客户端接入时提供安全验证,是完全可以避免非法用户登陆的呀??
      

  8.   

    呵呵,参考corba的主动服务器技术,微软在早些年就提出过主动服务器的“推”的概念,正好满足你的需求。agree dynku:服务器端保存客户列表,如有事件发生,主动向客户端发送消息。这也是消息驱动的基本概念。至于安全性,不知道老兄说的是什么?我在客户端接入时提供安全验证,是完全可以避免非法用户登陆的呀??注意,概念性问题:理论上,soket是一种安全稳定的连接方式,之所以造成当前不稳定的情况,是和网络环境及应用程序控制相关的,所以,不是soket能不能实现的问题,而是程序怎么控制的问题。to Dureek:呵呵,用RMI去控制界面,太可怕了吧!!在者说,RMI实际上也是通过socket传递方法的一个副本到本地运行,这样的话,为何不直接传递消息来的爽快,是吧!
      

  9.   

    服务器推送的数据由一组头标(通常包括“Content-type”)、数据本身和分割符(报文边界)三部分组成。浏览器看到分割符时,它保持状态不变,直到下一个数据块到达。 将以上概念进行用编程方法实现,就可以得到实际的服务器推送程序。例如,下面的Unix shell程序将使浏览器每5秒显示一次服务器上的进程列表: #!/bin/sh echo "HTTP/1.1 200" echo "Content-type: multipart/x-mixed-replace;boundary=--ThisRandomString--" echo "" echo "--ThisRandomString--" while true do echo "Content-type: text/html" echo "" echo "h2Processes on this machine updated every 5 seconds/h2" echo "time:" date echo "p" echo "plaintext" ps -el echo "--ThisRandomString--" sleep 5 done 注意到,边界设置在sleep语句之前发送,这能够确保浏览器清除其缓冲区,并显示所接收到的最新数据。 NCSA HTTPD用户在内容类型中不能使用空格,包括边界参数。NCSA HTTPD只能将不带空格字符的字符串作为内容类型。如果在内容类型行中存在空格(冒号后面的空格除外),空格后的任何文本都会被删除。 下面的示例是正确的: Content-type: multipart/x-mixed-replace;boundary=ThisRandomString 而下例则不能正常工作,因为它在中间有空格: Content-type: multipart/x-mixed-replace; boundary=ThisRandomString 服务器推送的另一个优点是它可以针对单个内联图象进行。包括图象的文档可以由服务器定时或定周期进行更新。而实现这一点非常简单:只需使IMG元素的SRC属性指向推送一系列图象的URL即可。 如果服务器推送用于单个内联图象,文档中的图象就会一次次被新推送来的图象所代替,而文档本身不需变化(假设文档没有进行服务器推送)。这样,WEB页面中有限的动画就可以为静态画面所代替。 客户端拖曳 客户端拖曳的一个简单用法是使文档按固定周期自动重载。例如,考虑下面的HTML文档: 
    This is Document ONE!
    Here's some text.
    如果将它载入支持动态文档的浏览器(Netscape 1.1以上,Internet Explorer和Mosaic也支持客户端拖曳),它将每隔一秒将自己重载一次。 由于META元素实际是在HTML文档中模拟HTTP响应头标,所以它能够告知浏览器将自身信息当作HTTP响应使用。上例中的META标记相当于: Refresh:1 这样,实际上就是HTTP头标告知浏览器每一秒更新一次文档。如果需要延时是12秒,那么就是这样的指令: 那么它等效于: Refresh:12 关于客户端的拖曳我也懒的继续写下去,关于怎么使客户端自动申请其他URL的数据话,请使用如下: 注意的是,此处的URL不能使用相对路径,必须全部指定。 其中时间间隔可以设置为0,这样浏览器在当前文档显示完毕后,以最快的速度载入新的数据! 
      

  10.   

    我想试试session对象,或者是ejb的sessionbean,改变session里面的数据,client自己改变了,而且session是独立的
      

  11.   

    hehe!我想最现实的方法是,客户端用applet实现显示,同时applet可以通过定时向服务期要信息的方式来实现更新数据;或者,客户端applet通过socket同服务器用udp方式通讯,服务器数据更新时,向客户端发送简单的更新命令(例如,发一串字符表示新的数据的文件名),然后再有applet通过url向服务器申请新的数据文件(或页面)。
    这种方法应该可以满足吧!
      

  12.   

    PHP做的服务器端的PUSH(推送)
     <?   
        /*--------------------------------------------------------------------------    Server push PHP3 script  
        A very short routine to perform simple server push animation,   
        with browser detection snippset. Server push work's only with   
        Netscape 4.0 or higher.  
        Author: Fabian Dennler, [email protected]  
        Date:01.05.2000  
          
        Insert the server push script like an image in your html file.  
        i.e. <IMG SRC="campush.php3">  
        ------------------------------------------------------------------------------------*/  
        // filelocation of the webcam image  
        $filename= "cam.jpg";  
        // how many time between push      
        // for unbuffered output set to 1.  
        $pause = "10";   
        // how many time to pass to passthru fun  
        //     ction , don't set this to high for serve  
        //     r usage  
        $PASSES = 20;   
          
        /*------------------------------------------------------------------------------------  
        for ($j=0;$j<=$PASSES;$j++) {  
            $img[count($img)] = $filename;  
        }   
        /*------------------------------------------------------------------------------------  
        /*------------------------------------------------------------------------------------*/  
            /* Plot the Currrent Data Block of the image */  
        /*------------------------------------------------------------------------------------*/  
        function plot_cam() {  
                global $filename,$img,$pause;  
                $k = 0;  
                Header("Content-type: multipart/x-mixed-replace;boundary=ThisRandomString");  
                while ($img[$k]==$filename) {  
                    print("n--ThisRandomStringnn");  
                    Header("Content-type: text/plain");  
                    $cam = fopen($filename,"r");   
                    fpassthru($cam);  
                     fclose($cam);  
                    if ($pause) { sleep($pause);} // time between reload, usefull for server usage  
                    $k++;  
                    if ($k==count($img)) {  
                        echo("n--ThisRandomString--n");                      
                    }  
                 }      
        }  
        /**************************************************************************************/  
            Broser Detection is provided by Leon Atkinson <[email protected]>  
        /*------------------------------------------------------------------------------------*/  
            /* Get the name the browser calls itself and what version */  
            $Browser_Name = strtok($HTTP_USER_AGENT, "/");  
            $Browser_Version = strtok(" ");  
            /* MSIE lies about its name */  
            if(ereg("MSIE", $HTTP_USER_AGENT))    {  
                $Browser_Name = "MSIE";  
                $Browser_Version = strtok("MSIE");  
                $Browser_Version = strtok(" ");  
                $Browser_Version = strtok(";");  
            }  
            /* Opera isn't completely honest, either ... */  
            /* Modificaton by Chris Mospaw <[email protected]> */  
            if(ereg("Opera", $HTTP_USER_AGENT))    {  
                $Browser_Name = "Opera";  
                $Browser_Version = strtok("Opera");  
                $Browser_Version = strtok("/");  
                $Browser_Version = strtok(";");  
            }  
            /* try to figure out what platform, windows or mac */  
            $Browser_Platform = "unknown";  
            if(ereg("Windows",$HTTP_USER_AGENT)   
                || ereg("WinNT",$HTTP_USER_AGENT)   
                || ereg("Win95",$HTTP_USER_AGENT)) {  
                    $Browser_Platform = "Windows";  
            }  
            if(ereg("Mac", $HTTP_USER_AGENT)) {  
                $Browser_Platform = "Macintosh";  
            }  
            if(ereg("X11", $HTTP_USER_AGENT)) {   
                $Browser_Platform = "Unix";   
            }   
            if(($Browser_Platform == "Windows")){  
                if($Browser_Name == "Mozilla")    {  
                    if($Browser_Version >= 3.0)    {  
                    }          
                    // SERVER PUSH WORK'S ONLY HERE :)  
                    if($Browser_Version >= 4.0)    { plot_cam(); }  
                }  
            }  
            elseif($Browser_Platform == "Macintosh") {  
                if($Browser_Name == "Mozilla") {  
                    if($Browser_Version >= 3.0)    {  
                    }          
                    // SERVER PUSH WORK'S ONLY HERE :)  
                    if($Browser_Version >= 4.0)    {plot_cam();}  
                }  
            }  
            elseif($Browser_Platform == "Unix") {   
                if($Browser_Name == "Mozilla") {   
                    if($Browser_Version >= 3.0) {   
                    }   
                    // SERVER PUSH WORK'S ONLY HERE :)  
                    if($Browser_Version >= 4.0) { plot_cam();}   
                }   
            }  
        exit;      
        ?>   
      

  13.   

    我说的安全性,又一个例子,就是oicq ,很容易收到非验证的信息
    我对安全方面了解不多,不过我想,如果使用过高的加密算法,是否会影响性能呢?
    希望能有高手说明.我觉得如果用applet 定期发送信息对带宽的浪费太大了,还是server 端主动一些好,省带宽
      

  14.   

    php的表示怎么那么复杂,一眼看去,全是$ - ,:-)
    不过有了他,可以试试移植到java
      

  15.   

    to dynku:在主动服务器机构中,安全验证只有在用户接入是发生,一旦用户通过验证接入,就被认为是合法用户,在以后的数据传输中,将不再进行合法性认证。这种模型的不安全性在于:如果有人能够骗取认证成为合法用户,就可以发送非法数据以攻击服务器,这就是关键所在。一般黑客的做法是:监听端口,分析数据包,找出认证部分,再伪造数据。这样的话就明白啦,合法性认证的关键就是认证信息的保密性,你说的加密是个好办法,不同的系统有不同的策略,安全第一,呵呵!
      

  16.   

    哪们高手能写一个jsp的让我们学习、学习
      

  17.   

    php这个是办法之一,实现比较简单,主要客户保持connection,然后服务器将数据打包成n个部分用同一个stream传给客户端。但是好像ezhb现在讨论的本意是客户和服务器有需要才联,这样的话,保持一个连接既耗资源(真的耗的比较厉害)又体现不出主动性。但是如果不保持连接,客户跟服务器之间的网络环境稍微复杂点,服务器就很难主动通知客户端了。不知大家对icq,yahoo messager这类instance messager有何看法?它们都是支持http proxy的,其中有个选项是keep connection alive,不选的话,收发消息也没什么特别的延时,特别是icq效果更好一点。我想参考icq的做法,应该对ezhb所描述的情况比较适用。:)
      

  18.   

    j2ee中有一个JMS(java message server)的功能可以实现Push技术。
      

  19.   

    to robber  可以介绍一下这个(JMS)吗?
      

  20.   

    不好意思我对j2ee了解不深,最好让其他大虾发表一下。
      

  21.   

    其实到底是在说web界面上的 server - push 还是client-server应用程序,好象不太一样哦……