HTTPServer.java
上传用户:huihesys
上传日期:2007-01-04
资源大小:3877k
文件大小:6k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /* CVS ID: $Id: HTTPServer.java,v 1.2 2000/04/06 08:02:02 wastl Exp $ */
  2. package net.wastl.webmail.standalone;
  3. import java.io.*;
  4. import java.net.*;
  5. import java.util.*;
  6. import net.wastl.webmail.server.*;
  7. import net.wastl.webmail.server.http.*;
  8. import net.wastl.webmail.ui.html.*;
  9. import net.wastl.webmail.debug.ErrorHandler;
  10. import net.wastl.webmail.config.ConfigurationListener;
  11. /**
  12.  * HTTPServer.java
  13.  *
  14.  * Created: Tue Feb  2 12:15:48 1999
  15.  *
  16.  * Copyright (C) 1999-2000 Sebastian Schaffert
  17.  * 
  18.  * This program is free software; you can redistribute it and/or
  19.  * modify it under the terms of the GNU General Public License
  20.  * as published by the Free Software Foundation; either version 2
  21.  * of the License, or (at your option) any later version.
  22.  * 
  23.  * This program is distributed in the hope that it will be useful,
  24.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  25.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  26.  * GNU General Public License for more details.
  27.  * 
  28.  * You should have received a copy of the GNU General Public License
  29.  * along with this program; if not, write to the Free Software
  30.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  31.  */
  32. /**
  33.  *
  34.  *
  35.  *
  36.  * @author Sebastian Schaffert
  37.  * @version $Revision: 1.2 $
  38.  */
  39. public class HTTPServer extends Thread implements ConfigurationListener {
  40.     protected boolean shutdown=false;
  41.     protected int port;
  42.     protected int max_connections;
  43.     protected int current_connections;
  44.     protected ConnectionTimer timer;
  45.     protected ServerSocket socket;
  46.     protected String socketstatus;
  47.     protected WebMailServer parent;
  48.     protected long start_time;
  49.     protected long nr_connections=0;
  50.     /** Don't accept connections if less than 5MB RAM available */
  51.     protected static final long required_free_memory=5000000;
  52.     protected HTTPServer() {
  53. super();
  54.     }
  55.     public HTTPServer(WebMailServer parent) {
  56. super();
  57. parent.getConfigScheme().configRegisterIntegerKey(this,"HTTP PORT","6789",
  58.   "Port where the HTTP server will accept connections");
  59. parent.getConfigScheme().configRegisterStringKey(this,"HTTP ADDRESS","0.0.0.0",
  60.  "Address for the HTTP Server to listen on (default: all addresses)");
  61. parent.getConfigScheme().configRegisterIntegerKey(this,"HTTP BACKLOG","50",
  62.   "HTTP Server Socket Backlog (how many connections to hold in Queue)");
  63. parent.getConfigScheme().configRegisterIntegerKey(this,"HTTP CONNECTION LIMIT","50",
  64.   "Maximum number of simultaneous connections (reduce to avoid server "+
  65.   "crash on machines with low memory, 20 should be ok for medium-high load machines)");
  66. parent.getConfigScheme().configRegisterIntegerKey(this,"HTTP TIMEOUT","60000",
  67.   "Timeout in ms for a HTTP connection (default 1 minute)");
  68. System.err.print("- HTTP Server ...");
  69. this.port=port;
  70. this.timer=parent.getConnectionTimer();
  71. this.parent=parent;
  72. port=6789;
  73. try {
  74.     port=Integer.parseInt(parent.getStorage().getConfig("HTTP PORT"));
  75. } catch(NumberFormatException e) {
  76. }
  77. max_connections=50;
  78. current_connections=0;
  79. try {
  80.     max_connections=Integer.parseInt(parent.getStorage().getConfig("HTTP CONNECTION LIMIT"));
  81. } catch(NumberFormatException e) {
  82. }
  83. int backlog=50;
  84. try {
  85.     backlog=Integer.parseInt(parent.getStorage().getConfig("HTTP BACKLOG"));
  86. } catch(NumberFormatException e) {
  87. }
  88. try {
  89.     socket=new ServerSocket(port,backlog,InetAddress.getByName(parent.getStorage().getConfig("HTTP ADDRESS")));
  90.     // Only block 1 second so we may shut down properly and in time.
  91.     socket.setSoTimeout(1000);
  92.     this.start();
  93. } catch(IOException ex) {
  94.     new ErrorHandler(ex);
  95. }
  96. System.err.println(" initialization complete. Listening on port "+port+".");
  97. start_time=System.currentTimeMillis();
  98.     }
  99.     
  100.     public WebMailServer getParent() {
  101. return parent;
  102.     }
  103.     public void shutdown() {
  104. shutdown=true;
  105. System.err.print("- HTTP Server shutdown requested ...");
  106. this.interrupt();
  107. try {
  108.     socket.close();
  109. } catch(Exception e) {}
  110. socket=null;
  111. timer.removeAll();
  112. try {
  113.     // Give connections enough time to terminate
  114.     sleep(2000);
  115. } catch(InterruptedException ex) {}
  116. //this.stop();
  117. System.err.println("complete!");
  118.     }
  119.     public String getStatus() {
  120. String alive=isAlive()?"alive":"not alive";
  121. // Disabled because it hangs on certain systems
  122. //String status="HTTP Server listening on "+socket.getInetAddress()+", Port "+port;
  123. String status="HTTP Server listening on "+parent.getStorage().getConfig("HTTP ADDRESS")+", Port "+port;
  124. long up=System.currentTimeMillis()-start_time;
  125. status+="nUptime: "+up/1000+" secondsn";
  126. status+="Number of connections so far: "+nr_connections+", average "+ (nr_connections*60000/up) +" conn/minn";
  127. status+="There are currently "+current_connections+" connections out of a maximum of "+max_connections+".n";
  128. return status;
  129.     }
  130.     public synchronized void lockConnection() {
  131. current_connections++;
  132. //System.err.println("Added connection. Now "+current_connections+" connected.");
  133.     }
  134.     public synchronized void unlockConnection() {
  135. current_connections--;
  136. //System.err.println("Removed connection. Now "+current_connections+" connected.");
  137. this.notifyAll();
  138.     }
  139.     public void notifyConfigurationChange(String key) {
  140. parent.reinitServer("HTTP");
  141.     }
  142.     public void run() {
  143. while(!shutdown) {
  144.     /* Enter critical resource. Connections must release this on termination! */
  145.     if(current_connections < max_connections) {
  146.     
  147. try {
  148.     if(Runtime.getRuntime().freeMemory() > required_free_memory) {
  149. Connection conn=new Connection(socket.accept(),parent,this);
  150. nr_connections++;
  151.     } else {
  152. parent.getStorage().log(Storage.LOG_ERR,"Error: Ran out of memory. Garbage collecting. You might want to increase the minimum memory size in webmail.sh to avoid this.");
  153. System.gc();
  154.     }
  155. } catch(InterruptedIOException ex) {
  156.     // this is valid if the server is shut down
  157.     //System.err.println("Interrupted!");
  158. } catch(IOException ex) {
  159.     if(!ex.getMessage().equals("Socket closed")) {
  160. new ErrorHandler(ex);
  161.     }
  162. }
  163.     } else {
  164. parent.getStorage().log(Storage.LOG_DEBUG,"HTTP Server: Maximum number of HTTP connections reached. You might want to increase the HTTP CONNECTION LIMIT if your server is fast enough");
  165. try {
  166.     synchronized(this) {
  167. wait();
  168.     }
  169. } catch(InterruptedException ex) {}
  170.     }
  171. }
  172.     }
  173. } // Server