`
iluoxuan
  • 浏览: 571226 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Servlet实现Comet服务器推送2

    博客分类:
  • java
 
阅读更多

1:聊天窗口的 处理servlet.

 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		 
	     String eventName = request.getParameter("eventName");
	     System.out.println("keeper is here -----"+eventName);
		 NameRegister reg = NameRegister.getInstance();
		 Event event =  reg.getEvent(eventName);
		 if(event == null){ 
		     event = new Event(eventName, this);
		     reg.setEvent(eventName, event);
		 }
		 
		 //阻塞
		 synchronized(this) {
		     while(!event.isProcess()){
		         try {
		             System.out.println("--keeper--阻塞中-----");
                     wait();
                } catch(InterruptedException e) {
                    e.printStackTrace();
                }
		     }
        }
		 System.out.println("--keeper--已经释放-----");
		 EventListener listener = event.getListener();
		 if(listener!= null){
		     listener.process(request, response);
		 }
		 //删除事件
		 reg.removeEvent(eventName);
		 
		 
		
	}

 从代码流程可以看出......有事件Evlent其实就是封装了 HttpServlet, 等:

 

public class Event
{
  private String eventName;
  private HttpServlet servlet;
  private EventListener listener;
  private boolean isProcess;

  public Event(String eventName, HttpServlet servlet)
  {
    this.eventName = eventName;
    this.servlet = servlet;
    this.isProcess = false;
    this.listener = null;
  }

 其中isProcess是作为释放servlet的线程的标志。

 

到发送请求 send到来的时候会进入SendServlet:

 

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        System.out.println("chat is here");
        String jid = request.getParameter("jid");
        String tojid = request.getParameter("tojid");
        String content = request.getParameter("content");
        Message message = new Message();
        message.setContent(content);
        message.setUserId(jid);
        message.setToUserId(tojid);
        Controller.action(new SendPrivateMsg(message.toString()), "msg");
        System.out.println("msg---is --over");
    }

 封装message然后,Controlller中处理 信息,其中SendPrivateMsg是一个 实现了EventListener的 类:

 

public interface EventListener {
    public void process(HttpServletRequest request, HttpServletResponse response);
}

看Controller:

 

public class Controller {
    public static boolean action(EventListener listener, String eventName){
        NameRegister reg = NameRegister.getInstance();
        HttpServlet servlet = null;
        Event e = null;
        try {
          e = reg.getEvent(eventName);
          if (e == null) {
              System.out.println("事件名称 null==");
            return false;
          }
          e.setListener(listener);
          servlet = e.getServlet();
          e.setProcess(true);
          synchronized (servlet) {
              System.out.println("事件名称=="+e.getEventName());
            servlet.notifyAll();
          }
        } catch (Exception ex) {
          ex.printStackTrace();

          if ((servlet != null) && (e != null)) {
            e = null;
            return true;
          }
        }
        return false;
      }
}

 主要是对 特定的事件 释放 阻塞,然后可以继续执行 

 

 EventListener listener = event.getListener();
		 if(listener!= null){
		     listener.process(request, response);
		 }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics