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
42 _outbound=outbound;
43 _members.add(this);
44 }
45
46 public void onMessage(byte frame, byte[] data,int offset, int length)
47 {
48
49 }
50
51 public void onMessage(byte frame, String data)
52 {
53 if (data.indexOf("disconnect")>=0)
54 _outbound.disconnect();
55 else
56 {
57
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
75 _members.remove(this);
76 }
77
78 public void onFragment(boolean more, byte opcode, byte[] data, int offset, int length)
79 {
80 }
81 }
82 }