View Javadoc

1   package com.acme;
2   //========================================================================
3   //Copyright 2011-2012 Mort Bay Consulting Pty. Ltd.
4   //------------------------------------------------------------------------
5   //All rights reserved. This program and the accompanying materials
6   //are made available under the terms of the Eclipse Public License v1.0
7   //and Apache License v2.0 which accompanies this distribution.
8   //The Eclipse Public License is available at
9   //http://www.eclipse.org/legal/epl-v10.html
10  //The Apache License v2.0 is available at
11  //http://www.opensource.org/licenses/apache2.0.php
12  //You may elect to redistribute this code under either of these licenses.
13  //========================================================================
14  
15  import java.io.IOException;
16  import java.util.Set;
17  import java.util.concurrent.CopyOnWriteArraySet;
18  
19  import javax.servlet.RequestDispatcher;
20  import javax.servlet.http.HttpServletRequest;
21  import javax.servlet.http.HttpServletResponse;
22  
23  import org.eclipse.jetty.util.TypeUtil;
24  import org.eclipse.jetty.util.log.Log;
25  import org.eclipse.jetty.util.log.Logger;
26  import org.eclipse.jetty.websocket.WebSocket;
27  import org.eclipse.jetty.websocket.WebSocketServlet;
28  
29  public class WebSocketChatServlet extends WebSocketServlet
30  {
31      private static final Logger LOG = Log.getLogger(WebSocketChatServlet.class);
32  
33      private final Set<ChatWebSocket> _members = new CopyOnWriteArraySet<ChatWebSocket>();
34      
35      @Override
36      protected void doGet(HttpServletRequest request, HttpServletResponse response) 
37          throws javax.servlet.ServletException ,IOException 
38      {
39          getServletContext().getNamedDispatcher("default").forward(request,response);
40      };
41      
42      public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol)
43      {
44          return new ChatWebSocket();
45      }
46      
47      /* ------------------------------------------------------------ */
48      /* ------------------------------------------------------------ */
49      class ChatWebSocket implements WebSocket.OnTextMessage
50      {
51          Connection _connection;
52  
53          public void onOpen(Connection connection)
54          {
55              // LOG.info(this+" onConnect");
56              _connection=connection;
57              _members.add(this);
58          }
59          
60          public void onMessage(byte frame, byte[] data,int offset, int length)
61          {
62              // LOG.info(this+" onMessage: "+TypeUtil.toHexString(data,offset,length));
63          }
64  
65          public void onMessage(String data)
66          {
67              if (data.indexOf("disconnect")>=0)
68                  _connection.disconnect();
69              else
70              {
71                  // LOG.info(this+" onMessage: "+data);
72                  for (ChatWebSocket member : _members)
73                  {
74                      try
75                      {
76                          member._connection.sendMessage(data);
77                      }
78                      catch(IOException e)
79                      {
80                          LOG.warn(e);
81                      }
82                  }
83              }
84          }
85          
86          public void onClose(int code, String message)
87          {
88              // LOG.info(this+" onDisconnect");
89              _members.remove(this);
90          }
91  
92      }
93  }