1 package com.acme;
2
3
4
5
6
7
8
9
10
11
12
13
14
15 import java.io.IOException;
16 import java.util.Set;
17 import java.util.concurrent.CopyOnWriteArraySet;
18
19 import javax.servlet.RequestDispatcher;
20 import javax.servlet.http.HttpServletRequest;
21 import javax.servlet.http.HttpServletResponse;
22
23 import org.eclipse.jetty.util.TypeUtil;
24 import org.eclipse.jetty.util.log.Log;
25 import org.eclipse.jetty.util.log.Logger;
26 import org.eclipse.jetty.websocket.WebSocket;
27 import org.eclipse.jetty.websocket.WebSocketServlet;
28
29 public class WebSocketChatServlet extends WebSocketServlet
30 {
31 private static final Logger LOG = Log.getLogger(WebSocketChatServlet.class);
32
33 private final Set<ChatWebSocket> _members = new CopyOnWriteArraySet<ChatWebSocket>();
34
35 @Override
36 protected void doGet(HttpServletRequest request, HttpServletResponse response)
37 throws javax.servlet.ServletException ,IOException
38 {
39 getServletContext().getNamedDispatcher("default").forward(request,response);
40 };
41
42 public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol)
43 {
44 return new ChatWebSocket();
45 }
46
47
48
49 class ChatWebSocket implements WebSocket.OnTextMessage
50 {
51 Connection _connection;
52
53 public void onOpen(Connection connection)
54 {
55
56 _connection=connection;
57 _members.add(this);
58 }
59
60 public void onMessage(byte frame, byte[] data,int offset, int length)
61 {
62
63 }
64
65 public void onMessage(String data)
66 {
67 if (data.indexOf("disconnect")>=0)
68 _connection.disconnect();
69 else
70 {
71
72 for (ChatWebSocket member : _members)
73 {
74 try
75 {
76 member._connection.sendMessage(data);
77 }
78 catch(IOException e)
79 {
80 LOG.warn(e);
81 }
82 }
83 }
84 }
85
86 public void onClose(int code, String message)
87 {
88
89 _members.remove(this);
90 }
91
92 }
93 }