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              if (data.indexOf("disconnect")>=0)
54                  _outbound.disconnect();
55              else
56              {
57                  // Log.info(this+" onMessage: "+data);
58                  for (ChatWebSocket member : _members)
59                  {
60                      try
61                      {
62                          member._outbound.sendMessage(frame,data);
63                      }
64                      catch(IOException e)
65                      {
66                          Log.warn(e);
67                      }
68                  }
69              }
70          }
71  
72          public void onDisconnect()
73          {
74              // Log.info(this+" onDisconnect");
75              _members.remove(this);
76          }
77  
78          public void onFragment(boolean more, byte opcode, byte[] data, int offset, int length)
79          {
80          }
81      }
82  }