import java.io.*; import java.util.*; import java.net.*; public class WebServer { static private GuardedBoundedQueue _queue = new GuardedBoundedQueue(5); public static void main(String [] args) { new Worker(_queue,"Alice").start(); new Worker(_queue,"Bob").start(); new Worker(_queue,"Carol").start(); new Worker(_queue,"Dave").start(); try { ServerSocket s = new ServerSocket(8000); while (true) { Socket incoming = s.accept(); if (_queue.getCount() >= 4) { System.out.println("WARNING: Server overloaded, dropping connection"); incoming.close(); } else { _queue.push(incoming); } } } catch (Exception e) { System.out.println("Terminating server: "+e.toString()); } } } class Worker extends Thread { private BoundedQueue _queue; private String _name; private int _maxSleep = 400; public Worker(BoundedQueue queue, String name) { _queue = queue; _name = name; } public void run() { try { while (true) { Socket sock = (Socket)_queue.pop(); System.out.println(_name+ " handling request"); try { sleep((int)(Math.random()*_maxSleep)); } catch (InterruptedException e) {} // Handle request: BufferedReader in = new BufferedReader(new InputStreamReader( sock.getInputStream())); PrintWriter out = new PrintWriter(new OutputStreamWriter( sock.getOutputStream())); // HTTP requests are terminated with a blank // line; our dumb web server totally ignores // the request itself: while (true) { String line = in.readLine(); System.out.println(_name+": Req: "+line); if (line == null || "".equals(line)) break; } String response = ""+ _name+": Please come back later, I'm busy!"; out.println("HTTP/1.0 200 OK"); out.println("MIME-Version: 1.0"); out.println("Content-Type: text/html"); out.println("Content-Length: "+response.length()); out.println("Last-Modified: Tue, 12 Dec 2000 00:00:00"); out.println(""); out.println(response); out.flush(); sock.close(); } } catch (IOException e) { System.out.println("Terminating "+_name+" : "+e.toString()); } } }