2010-08-10 2 views
0

자바와 dwr ajax reverse를 사용하여 웹 채팅을 개발 중입니다. 나는 그들이자바와 dwr을 사용하여 ajax 웹 채팅에서 사용자 목록을 업데이트하는 방법

1.when 사용자가 브라우저

서버 측 코드 자바

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); 
      } 
     }); 
    } 
} 

클라이언트 측 코드 자바 스크립트

function removeUser(){ 
    Chat.addOrRemoveUser(chat.userid,0); 
} 
을 닫습니다 오프라인 상태 일 때 사용자를 제거하는 방법에 대한 두 가지 질문 있어요

사용자가 브라우저를 닫을 때 onunload 이벤트로 removeUser()를 바인딩합니다. 그것은 파이어 폭스와 크롬으로 확인하지만 다음과 같은 서버 로그와 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를 사용하는 것이 좋습니다.

# 2에 대해서는 DefaultScriptSessionManager을 참조하십시오. 여기에는 모든 활성 세션을 가져 오는 메소드와 죽은 세션을 확인하기 위해 시간 초과를 변경하는 메소드가 있습니다.