2013-12-10 31 views
0

我使用HTTP彗星使用此代碼做一個網絡聊天:當我使用http彗星,我怎樣才能讓Tomcat發送TCP keepalive報文

public void event(CometEvent event) throws IOException, ServletException { 

      HttpServletRequest request = event.getHttpServletRequest(); 
      HttpServletResponse response = event.getHttpServletResponse(); 

      String regKey = request.getParameter("rk"); 
      if (regKey == null) { 
       return; 
      } 

      if (event.getEventType() == CometEvent.EventType.BEGIN) { 
       event.setTimeout(Integer.MAX_VALUE); 
       System.out.println("Client [" + regKey + "] login..."); 
       synchronized (connections) { 
        connections.put(regKey, response); 
       } 
      } else if (event.getEventType() == CometEvent.EventType.ERROR) { 
       System.out.println("Client [" + regKey + "] error..."); 
       synchronized (connections) { 
        connections.remove(regKey); 
       } 
       event.close(); 
      } else if (event.getEventType() == CometEvent.EventType.END) { 
       System.out.println("Client [" + regKey + "] logout..."); 
       synchronized (connections) { 
        connections.remove(regKey); 
       } 
       event.close(); 
      } else if (event.getEventType() == CometEvent.EventType.READ) { 
       System.out.println("Client [" + regKey + "] read..."); 
       synchronized (connections) { 
        connections.remove(regKey); 
       } 
       event.close(); 
      } 
     } 

如果布勞爾或客戶端接近正常,我可以接受CometEvent.EventType.END事件, 但如果客戶端停電我沒有收到任何消息。我知道TCP正在等待網絡恢復,但我想處理此事件,以便更新在線列表和其他重要事情(這意味着我必須處理此事件!!!)。

我知道TCP keep-alive可以解決這個問題,但是tomcat默認不發送keep-alive包給客戶端,我該如何解決呢。
我相信tomcat可以發送TCP keep-alive數據包,但是如何配置tomcat?

謝謝!

回答

1

我不確定它會實現您正在查找的行爲,但您可以通過爲server.xml中的NIO HTTP連接器設置socket.soKeepAlive="true"來啓用TCP保持活動狀態。如果您使用APR /本地HTTP連接器,則不存在配置選項來啓用TCK保持活動狀態。 BIO HTTP連接器不支持Comet,因此如果要啓用Comet的TCP保持連接,則必須使用NIO HTTP連接器。

+0

謝謝你,我是中國人,所以我的英語很差。我已經解決了這個問題,但是當我使用tomcat 7運行彗星Web應用程序時,我在瀏覽器中收到405,應該更改哪個配置文件? – user3047724