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