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      @Override
28      protected WebSocket doWebSocketConnect(HttpServletRequest request, String protocol)
29      {
30          return new ChatWebSocket();
31      }
32      
33      /* ------------------------------------------------------------ */
34      /* ------------------------------------------------------------ */
35      class ChatWebSocket implements WebSocket
36      {
37          Outbound _outbound;
38  
39          public void onConnect(Outbound outbound)
40          {
41              // Log.info(this+" onConnect");
42              _outbound=outbound;
43              _members.add(this);
44          }
45          
46          public void onMessage(byte frame, byte[] data,int offset, int length)
47          {
48              // Log.info(this+" onMessage: "+TypeUtil.toHexString(data,offset,length));
49          }
50  
51          public void onMessage(byte frame, String data)
52          {
53              // Log.info(this+" onMessage: "+data);
54              for (ChatWebSocket member : _members)
55              {
56                  try
57                  {
58                      member._outbound.sendMessage(frame,data);
59                  }
60                  catch(IOException e)
61                  {
62                      Log.warn(e);
63                  }
64              }
65          }
66  
67          public void onDisconnect()
68          {
69              // Log.info(this+" onDisconnect");
70              _members.remove(this);
71          }
72      }
73  }