jsp/servlet用推技术实现聊天室,有做过或有相关好资料的麻烦您啦~
最好付源代码,如果鉴于个人成果也可以给部分么。急求啊!!!!

解决方案 »

  1.   

    用Java实现内容推送  
    结合JavaScript帧间通信和一个管理网络通信的Java Applet,我们能够用推送技术解决这个问题。在这样一个系统中,Java Applet的任务是连接服务器并监听内容更新。一旦接收到了新的内容,Applet就构造出显示这些新内容的HTML代码,调用一个JavaScript函数并把包含新内容的HTML传递给JavaScript函数。JavaScript函数运用DHTML和DOM技术,把页面中一个<div>标记的内容用参数中传入的新内容替换。由于浏览器安全的限制,Applet所打开的Socket端口只能连接到下载该Applet的服务器。  Web服务器只在80端口监听连接请求。因此,除了Web服务器之外,我们还需要一个接受Applet的Socket连接请求的网络应用服务。这个网络应用服务定时地查询数据库,改动把数据发布(推送)所到有已经连接的Applet。由于运用了隐藏帧和JavaScript的帧间通信功能,我们能够从用户面前隐藏大多数JavaScript逻辑。  在这整个处理过程中,最困难的任务是Java Applet与JavaScript代码之间的通信。Netscape提供了一个称为netscape.javascript.JSObject的类。要使用这个对象,请加入一个包含特殊“MAYSCRIPT”属性的Applet标记: <APPLET code="MyApplet.class" height=1 width=1 MAYSCRIPT>  JSObject的方法允许Applet与文档对象交互以及调用JavaScript命令。例如,把下面的代码放入Applet,我们就能够访问窗口对象:  import netscape.javascript.*; public class MyApplet extends java.applet.Applet{ private JSObject mainwin; public void init(){ mainwin = JSObject.getWindow(this); } }  获得JSObject引用后,我们就能够访问文档窗口对象,并通过JSObject的eval()方法调用JavaScript函数。  用DHTML更新页面  
    在把来自Applet的新内容写入文档时,为了不影响原来已经存在的内容,我们可以使用HTML的<div></div>标记。这个标记在IE和Netscape中是不同的。    对于IE以及Netscape 6,这个HTML标记是:  // 所有要更新的内容必须用id标识 <div id="iexplorer" width=700px ></div>  
      对于Netscape 4.x版本,这个HTML标记是:  <DATA><layer id="netscapev" ></layer></DATA>    虽然我们可以通过引用适当的ID,从Applet直接更新HTML内容,但为了清楚起见,我们将把更新HTML代码的程序逻辑放入JavaScript函数。下面的JavaScript代码把浏览器的类型保存到ie变量:  applnname=navigator.appName; if(applnname=="Microsoft Internet Explorer") { ie=true; } else { ie=false; }  Applet从新数据构造出HTML代码,把它保存到JavaScript变量content,然后调用assignData()方法。内容数据可以是从纯HTML到XML到二进制数据的任何东西。  // 根据浏览器类型调用合适的方法 function assignData() { if(ie) {explore();} else {navig(); } }  
    如果浏览器是IE或者Netscape 6,Applet调用explore()方法:  //content是一个javascript变量,它以HTML格式描述了需要 //显示的新数据 function explore() { iexplorer.innerHTML=content; }    如果浏览器是Netscape 4.0或者更高版本,Applet调用navig()方法:  function navig() { document.netscapev.document.write(“<DATA>“ + content + “</DATA>“); document.netscapev.document.close(); }  通信过程  
    在服务器端,一个ImageAppliation.java类的实例响应Socket连接请求,并为每一个新的连接请求创建一个新的线程。为了简化代码,每一个线程只检查数据文件是否改变。如果数据文件已经改变,则线程读取文件内容,并把新的数据发送给已经连接的Applet(示例应用把整个文件发送给Applet)。  在客户端,一个隐藏帧包含了ImageApplet.java这个Applet,因此用浏览器的查看HTML源代码功能是无法看到Applet标记的。Applet实现了连接服务器(下载该Applet的源服务器)的功能,并实现了一个简单的通信协议。建立与服务器的连接之后,Applet接收来自服务器的数据,构造出HTML代码,并调用JavaScript函数把数据传入文档:  public void upDateHTML(String str){ //data是表单的名字, //quote是一个JavaScript变量 //str是新构造出来的HTML代码 mainwin.eval("document.data.quote.value=“" + str + "“"); mainwin.eval("javascript:assignData()"); return; }  netscape.javascript.JSObject完成Applet到JavaScript的通信,不同版本的客户端浏览器需要不同的版本。你可以下载得到为Netscape提供的压缩类文件java40.jar。IE已经带有JSObject类,但有点难找。你可以搜索$windows$\Java\Packages目录寻找包含JSObject类的ZIP文件。  服务器把ImageArrayElement.java类的实例通过toString()方法串行化成为字符串发送给Applet。服务器从数据文件构造出各个对象,调用toString()方法,连接得到代表所有对象的字符串,最后发送结果字符串。而在另一端,Applet接收并解析这个字符串,重新构造出各个ImageArrayElement对象。这里之所以用一个长字符串的形式发送数据,是因为这种方法只需要很简单的处理过程,使得用户能够以接近实时的速度立即得知数据的变化;但是,我们也可以用另外一种方法,即以向量的形式发送对象。  在一个正式运行的应用中,你一般应该让新数据插入当前页面的过程透明。但在示例应用中,为了让程序运行过程更加直观,它将在新内容到达的时候提示用户。  推送技术最主要的优点就是应用服务器只把那些改变的数据发送到网络,从而使得延迟减到了最少。由于这个Applet负责完成的工作非常少(不涉及用户界面,这部分工作由浏览器负责),所以Applet体积很小,装载速度非常快。
      

  2.   

    谢谢你了,但是我现在主要是不知道怎么把socket端口读到的信息实时发送到客户端的jsp页面
      

  3.   

    "实时"是不可能做到的事实:
    1一个frame里的js可能向另一个frame添加内容
    2一个frame可以自动不断的刷新/http post/get
    3一个frame可以用js控制滚动到第10000000行如果你做过可以理解
      

  4.   

    谢谢bdsc了,我也是想通过你这种方法来做,刚开始学jsp,很多东西还不会,你有没有一些源码可以让我借鉴一下。 谢谢啦
      

  5.   

    bdsc 能不能给详细一点地解释,帮帮小弟吧
      

  6.   

    具体的是在SERVER端自己做一个HTTP SERVER,使来自客户端的GET请求不断开,这样IE就会一直读网页,而网页的内容是最新的数据不断生成,这样保证了实时性。因为一个SERVER能承受的不断的连接有限制,所以网站的聊天室会有人数限制。这就是所谓的推技术聊天室
      

  7.   

    用applet通过socket好像穿不过防火墙哦:)
      

  8.   

    如果需要长连接的话,在服务器端的Servlet上不返回response,一直保持连接,然后保存输出到统一容器中,在需要发送的时候,向容器中的输出发送你的message
      

  9.   

    <java servlet 编程> 一书中有提到过web push 技术但是例子很差劲,
      

  10.   

    下面是书中的源代码,import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;import com.oreilly.servlet.MultipartResponse;
    import com.oreilly.servlet.ServletUtils;public class Countdown extends HttpServlet
    {
    static final String Launch = "/iamges/launch.gif";
    public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException
    {
    MultipartResponse multi=new MultipartResponse(res);
    //PrintWriter out = res.getWriter();
    //ServletOutputStream out; for (int i=100;i>0;i--)
    {
    multi.startResponse("text/plain");
    multi.startResponse("<a href=\'#\'>" i + "</a>");
    multi.endResponse();
    try
    {
    Thread.sleep(100);
    }
    catch (InterruptedException e)
    {
    }
    }
    multi.startResponse("image/gif");
    try
    {
    //ServletUtils.returnFile(req.getRealPath(Launch),out);
    //ServletUtils.returnFile(Launch,out);
    //out.println("It's my end of the game!");
    }
    //catch (FileNotFoundException ex)
    catch (Exception ex)
    {
    throw new ServletException("Could not find file:"+ex.getMessage());
    }
    multi.finish();
    }
    };
      

  11.   

    import com.oreilly.servlet.MultipartResponse;
    import com.oreilly.servlet.ServletUtils;
    上面的包可以到oreilly公司站点下载,或者给我发邮件我发给你们.
      

  12.   

    import java.net.*;
    import java.io.*;
    public class Server 
    {
      public static void main (String[] args) throws IOException
      {
          ServerSocket socket = new ServerSocket(8123); 
           //while (true) 
           //{ 
           Socket nclient = socket.accept(); 
           //BufferedReader sin = new BufferedReader(new InputStreamReader(insocket.getInputStream())); 
           PrintWriter pout = new PrintWriter(nclient.getOutputStream(), true);
           pout.print("Connection from " +nclient.getInetAddress().getHostAddress());
           pout.print("today is ");
           pout.println(new java.util.Date().toString());
           pout.println("select 1 or 2");
     
              BufferedReader in = new BufferedReader (new InputStreamReader(nclient.getInputStream()));
              PrintWriter out = new PrintWriter (nclient.getOutputStream(), true);
     
              String instring = in.readLine();
              out.println("The server got this: " + instring);
              nclient.close();
              
           pout.close();
           nclient.close();
           socket.close();
           System.out.print("connect close");
           //}
        }
    }
    ===========================================================================
    import java.net.*; 
    import java.io.*;
     public class Client 
     {
       public static void main(String[] args) throws UnknownHostException, IOException
       {
       Socket socket=new Socket("127.0.0.1",8123);
       //Socket ClientSocket = new Socket();
        /*
       InputStream in = socket.getInputStream(); 
        BufferedReader bin = new BufferedReader(new InputStreamReader(in)); 
        String line; 
        while((line=bin.readLine())!= null)
        System.out.println(line);
        */
        int character;
        InputStream in = socket.getInputStream();
        OutputStream out = socket.getOutputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //String str=br.readLine();  //這段被我註解掉了 原因就是 當我要這樣輸入的時候他都會停住 似乎無法判斷 我輸入的字元已經完成了
        String str = "Hello!\n"; //直接傳字串 ok
        //System.out.println(str);
        byte buffer[] = str.getBytes();
        out.write(buffer);
     
        while ((character = in.read()) != -1) {
            System.out.print((char) character);
        }
        socket.close();
       }
     } 
    原理,慢看吧!