View Javadoc

1   package com.acme;
2   
3   import java.io.IOException;
4   import java.util.Set;
5   import java.util.concurrent.CopyOnWriteArraySet;
6   
7   import javax.servlet.RequestDispatcher;
8   import javax.servlet.http.HttpServletRequest;
9   import javax.servlet.http.HttpServletResponse;
10  
11  import org.eclipse.jetty.util.TypeUtil;
12  import org.eclipse.jetty.util.log.Log;
13  import org.eclipse.jetty.util.log.Logger;
14  import org.eclipse.jetty.websocket.WebSocket;
15  import org.eclipse.jetty.websocket.WebSocketServlet;
16  
17  public class WebSocketChatServlet extends WebSocketServlet
18  {
19      private static final Logger LOG = Log.getLogger(WebSocketChatServlet.class);
20  
21      private final Set<ChatWebSocket> _members = new CopyOnWriteArraySet<ChatWebSocket>();
22      
23      @Override
24      protected void doGet(HttpServletRequest request, HttpServletResponse response) 
25          throws javax.servlet.ServletException ,IOException 
26      {
27          getServletContext().getNamedDispatcher("default").forward(request,response);
28      };
29      
30      public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol)
31      {
32          return new ChatWebSocket();
33      }
34      
35      /* ------------------------------------------------------------ */
36      /* ------------------------------------------------------------ */
37      class ChatWebSocket implements WebSocket.OnTextMessage
38      {
39          Connection _connection;
40  
41          public void onOpen(Connection connection)
42          {
43              // LOG.info(this+" onConnect");
44              _connection=connection;
45              _members.add(this);
46          }
47          
48          public void onMessage(byte frame, byte[] data,int offset, int length)
49          {
50              // LOG.info(this+" onMessage: "+TypeUtil.toHexString(data,offset,length));
51          }
52  
53          public void onMessage(String data)
54          {
55              if (data.indexOf("disconnect")>=0)
56                  _connection.disconnect();
57              else
58              {
59                  // LOG.info(this+" onMessage: "+data);
60                  for (ChatWebSocket member : _members)
61                  {
62                      try
63                      {
64                          member._connection.sendMessage(data);
65                      }
66                      catch(IOException e)
67                      {
68                          LOG.warn(e);
69                      }
70                  }
71              }
72          }
73          
74          public void onClose(int code, String message)
75          {
76              // LOG.info(this+" onDisconnect");
77              _members.remove(this);
78          }
79  
80      }
81  }