import java.io.*; import java.net.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import com.oreilly.servlet.RemoteDaemonHttpServlet; public class DaytimeServlet extends RemoteDaemonHttpServlet implements DaytimeServer { // The single method from DaytimeServer public Date getDate() { return new Date(); } public void init(ServletConfig config) throws ServletException { // As before, if you override init() you have to call super.init() super.init(config); } public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { // If the client says "format=object" then // send the Date as a serialized object if ("object".equals(req.getParameter("format"))) { ObjectOutputStream out = new ObjectOutputStream(res.getOutputStream()); out.writeObject(getDate()); } // Otherwise send the Date as a normal ASCII string else { PrintWriter out = res.getWriter(); out.println(getDate().toString()); } } public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { doGet(req, res); } public void destroy() { // If you override destroy() you also have to call super.destroy() super.destroy(); } // Handle a client's socket connection by spawning a DaytimeConnection // thread. public void handleClient(Socket client) { new DaytimeConnection(this, client).start(); } } class DaytimeConnection extends Thread { DaytimeServlet servlet; Socket client; DaytimeConnection(DaytimeServlet servlet, Socket client) { this.servlet = servlet; this.client = client; setPriority(NORM_PRIORITY - 1); } public void run() { try { // Read the first line sent by the client DataInputStream in = new DataInputStream( new BufferedInputStream( client.getInputStream())); String line = in.readLine(); // If it was "object" then return the Date as a serialized object if ("object".equals(line)) { ObjectOutputStream out = new ObjectOutputStream(client.getOutputStream()); out.writeObject(servlet.getDate()); out.close(); } // Otherwise, send the Date as a normal string else { // Wrap a PrintStream around the Socket's OutputStream PrintStream out = new PrintStream(client.getOutputStream()); out.println(servlet.getDate().toString()); out.close(); } // Be sure to close the connection client.close(); } catch (IOException e) { servlet.getServletContext() .log(e, "IOException while handling client request"); } catch (Exception e) { servlet.getServletContext() .log("Exception while handling client request"); } } }