2010-08-10 55 views
0

我正在開發與java和dwr ajax反向的web聊天。我得如何時,他們離線如何更新使用java和dwr的ajax web聊天中的用戶列表

1.當用戶關閉瀏覽器

服務器端代碼的Java

import java.util.HashMap; 
import java.util.Map; 

import org.directwebremoting.Browser; 
import org.directwebremoting.ScriptSessions; 

public class Chat{ 
    private int id = 0; 
    private final Map<String,String> users = new HashMap<String, String>(); 

    /** 
    * @param idOrName when type=0 is id when type=1 is name 
    * @param type type=0 remove a user type=1 add a user 
    */ 
    public void addOrRemoveUser(String idOrName,int type){ 
     if(type == 0){ 
      users.remove(idOrName); 
     } 
     if(type == 1){ 
      users.put(String.valueOf(id++),idOrName); 
     } 
     Browser.withCurrentPage(new Runnable() { 
      public void run() { 
       ScriptSessions.addFunctionCall("updateUserList", users); 
      } 
     }); 
    } 
} 

客戶端代碼的JavaScript

function removeUser(){ 
    Chat.addOrRemoveUser(chat.userid,0); 
} 
刪除用戶的兩個問題

當用戶關閉瀏覽器時,我將removeUser()與onunload事件綁定。它是確定與Firefox和Chrome,但在IE8中失敗,出現以下服務器日誌:

2010-8-10 22:34:58 org.directwebremoting.dwrp.BaseCallHandler marshallException 
警告: Exception while processing batch 
org.directwebremoting.extend.ServerException: Failed to read input 
    at org.directwebremoting.dwrp.Batch.parseBasicPost(Batch.java:224) 
    at org.directwebremoting.dwrp.Batch.parsePost(Batch.java:116) 
    at org.directwebremoting.dwrp.Batch.<init>(Batch.java:56) 
    at org.directwebremoting.dwrp.CallBatch.<init>(CallBatch.java:46) 
    at org.directwebremoting.dwrp.BaseCallHandler.handle(BaseCallHandler.java:72) 
    at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:120) 
    at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:141) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:163) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:556) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:402) 
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:310) 
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:575) 
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1555) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:619) 
Caused by: java.io.IOException 
    at org.apache.coyote.http11.InternalAprInputBuffer.fill(InternalAprInputBuffer.java:798) 
    at org.apache.coyote.http11.InternalAprInputBuffer$SocketInputBuffer.doRead(InternalAprInputBuffer.java:827) 
    at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:116) 
    at org.apache.coyote.http11.InternalAprInputBuffer.doRead(InternalAprInputBuffer.java:738) 
    at org.apache.coyote.Request.doRead(Request.java:427) 
    at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:286) 
    at org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:407) 
    at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:309) 
    at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:198) 
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264) 
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306) 
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158) 
    at java.io.InputStreamReader.read(InputStreamReader.java:167) 
    at java.io.BufferedReader.fill(BufferedReader.java:136) 
    at java.io.BufferedReader.readLine(BufferedReader.java:299) 
    at java.io.BufferedReader.readLine(BufferedReader.java:362) 
    at org.directwebremoting.dwrp.Batch.parseBasicPost(Batch.java:181) 
    ... 23 more 

2.Is有什麼辦法可以去除誰服務器不能推送消息給用戶?

回答

0

我想這裏發生的事情是你開始一個POST(執行你的遠程方法),但是因爲它是onunload,瀏覽器窗口在它完成之前就會消失。

我建議嘗試onbeforeunload而不是onunload。

關於#2,請看DefaultScriptSessionManager。這具有獲取所有活動會話的方法,以及更改超時以檢查死亡會話的方法。

相關問題