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
44 _connection=connection;
45 _members.add(this);
46 }
47
48 public void onMessage(byte frame, byte[] data,int offset, int length)
49 {
50
51 }
52
53 public void onMessage(String data)
54 {
55 if (data.indexOf("disconnect")>=0)
56 _connection.disconnect();
57 else
58 {
59
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
77 _members.remove(this);
78 }
79
80 }
81 }