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