package com.acme; import java.io.IOException; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import javax.servlet.RequestDispatcher; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.util.TypeUtil; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.websocket.WebSocket; import org.eclipse.jetty.websocket.WebSocketServlet; public class WebSocketChatServlet extends WebSocketServlet { private static final Logger LOG = Log.getLogger(WebSocketChatServlet.class); private final Set<ChatWebSocket> _members = new CopyOnWriteArraySet<ChatWebSocket>(); @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException ,IOException { getServletContext().getNamedDispatcher("default").forward(request,response); }; public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) { return new ChatWebSocket(); } /* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */ class ChatWebSocket implements WebSocket.OnTextMessage { Connection _connection; public void onOpen(Connection connection) { // LOG.info(this+" onConnect"); _connection=connection; _members.add(this); } public void onMessage(byte frame, byte[] data,int offset, int length) { // LOG.info(this+" onMessage: "+TypeUtil.toHexString(data,offset,length)); } public void onMessage(String data) { if (data.indexOf("disconnect")>=0) _connection.disconnect(); else { // LOG.info(this+" onMessage: "+data); for (ChatWebSocket member : _members) { try { member._connection.sendMessage(data); } catch(IOException e) { LOG.warn(e); } } } } public void onClose(int code, String message) { // LOG.info(this+" onDisconnect"); _members.remove(this); } } }