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