import java.io.*; import java.net.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class ChatServlet extends HttpServlet { MessageSource source = new MessageSource(); public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/plain"); PrintWriter out = res.getWriter(); out.println(getNextMessage()); } public void doPost (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String message = req.getParameter("message"); if (message != null) broadcastMessage(message); res.setStatus(res.SC_NO_CONTENT);; } public String getNextMessage() { return new MessageSink().getNextMessage(source); } public void broadcastMessage(String message) { source.sendMessage(message); } } class MessageSource extends Observable { public void sendMessage(String message) { setChanged(); notifyObservers(message); } } class MessageSink implements Observer { String message = null; synchronized public void update(Observable o, Object arg) { message = (String)arg; notify(); } synchronized public String getNextMessage(MessageSource source) { source.addObserver(this); while (message == null) { try { wait(); } catch (Exception ignored) { } } source.deleteObserver(this); String messageCopy = message; message = null; return messageCopy; } }