/razpubs/src/org/cybergarage/http/HTTPServer.java

http://razpub.googlecode.com/ · Java · 216 lines · 143 code · 35 blank · 38 comment · 16 complexity · ac0c1fd0dc054e365324d2fca5e45411 MD5 · raw file

  1. /******************************************************************
  2. *
  3. * CyberHTTP for Java
  4. *
  5. * Copyright (C) Satoshi Konno 2002-2003
  6. *
  7. * File: HTTPServer.java
  8. *
  9. * Revision;
  10. *
  11. * 12/12/02
  12. * - first revision.
  13. * 10/20/03
  14. * - Improved the HTTP server using multithreading.
  15. * 08/27/04
  16. * - Changed accept() to set a default timeout, HTTP.DEFAULT_TIMEOUT, to the socket.
  17. *
  18. ******************************************************************/
  19. package org.cybergarage.http;
  20. import java.io.*;
  21. import java.net.*;
  22. import org.cybergarage.http.HTTP;
  23. import org.cybergarage.http.HTTPRequest;
  24. import org.cybergarage.http.HTTPRequestListener;
  25. import org.cybergarage.http.HTTPServerThread;
  26. import org.cybergarage.util.*;
  27. public class HTTPServer implements Runnable
  28. {
  29. ////////////////////////////////////////////////
  30. // Constants
  31. ////////////////////////////////////////////////
  32. public final static String NAME = "CyberHTTP";
  33. public final static String VERSION = "1.0";
  34. public final static int DEFAULT_PORT = 80;
  35. public static String getName()
  36. {
  37. String osName = System.getProperty("os.name");
  38. String osVer = System.getProperty("os.version");
  39. return osName + "/" + osVer + " " + NAME + "/" + VERSION;
  40. }
  41. ////////////////////////////////////////////////
  42. // Constructor
  43. ////////////////////////////////////////////////
  44. public HTTPServer()
  45. {
  46. serverSock = null;
  47. }
  48. ////////////////////////////////////////////////
  49. // ServerSocket
  50. ////////////////////////////////////////////////
  51. private ServerSocket serverSock = null;
  52. private InetAddress bindAddr = null;
  53. private int bindPort = 0;
  54. public ServerSocket getServerSock()
  55. {
  56. return serverSock;
  57. }
  58. public String getBindAddress()
  59. {
  60. if (bindAddr == null)
  61. return "";
  62. return bindAddr.toString();
  63. }
  64. public int getBindPort()
  65. {
  66. return bindPort;
  67. }
  68. ////////////////////////////////////////////////
  69. // open/close
  70. ////////////////////////////////////////////////
  71. public boolean open(String addr, int port)
  72. {
  73. if (serverSock != null)
  74. return true;
  75. try {
  76. bindAddr = InetAddress.getByName(addr);
  77. bindPort = port;
  78. serverSock = new ServerSocket(bindPort, 0, bindAddr);
  79. }
  80. catch (IOException e) {
  81. return false;
  82. }
  83. return true;
  84. }
  85. public boolean close()
  86. {
  87. if (serverSock == null)
  88. return true;
  89. try {
  90. serverSock.close();
  91. serverSock = null;
  92. bindAddr = null;
  93. bindPort = 0;
  94. }
  95. catch (Exception e) {
  96. Debug.warning(e);
  97. return false;
  98. }
  99. return true;
  100. }
  101. public Socket accept()
  102. {
  103. if (serverSock == null)
  104. return null;
  105. try {
  106. Socket sock = serverSock.accept();
  107. sock.setSoTimeout(HTTP.DEFAULT_PORT * 1000);
  108. return sock;
  109. }
  110. catch (Exception e) {
  111. return null;
  112. }
  113. }
  114. public boolean isOpened()
  115. {
  116. return (serverSock != null) ? true : false;
  117. }
  118. ////////////////////////////////////////////////
  119. // httpRequest
  120. ////////////////////////////////////////////////
  121. private ListenerList httpRequestListenerList = new ListenerList();
  122. public void addRequestListener(HTTPRequestListener listener)
  123. {
  124. httpRequestListenerList.add(listener);
  125. }
  126. public void removeRequestListener(HTTPRequestListener listener)
  127. {
  128. httpRequestListenerList.remove(listener);
  129. }
  130. public void performRequestListener(HTTPRequest httpReq)
  131. {
  132. int listenerSize = httpRequestListenerList.size();
  133. for (int n=0; n<listenerSize; n++) {
  134. HTTPRequestListener listener = (HTTPRequestListener)httpRequestListenerList.get(n);
  135. listener.httpRequestRecieved(httpReq);
  136. }
  137. }
  138. ////////////////////////////////////////////////
  139. // run
  140. ////////////////////////////////////////////////
  141. private Thread httpServerThread = null;
  142. public void run()
  143. {
  144. if (isOpened() == false)
  145. return;
  146. Thread thisThread = Thread.currentThread();
  147. while (httpServerThread == thisThread) {
  148. Thread.yield();
  149. Socket sock;
  150. try {
  151. Debug.message("accept ...");
  152. sock = accept();
  153. if (sock != null)
  154. Debug.message("sock = " + sock.getRemoteSocketAddress());
  155. }
  156. catch (Exception e){
  157. Debug.warning(e);
  158. break;
  159. }
  160. HTTPServerThread httpServThread = new HTTPServerThread(this, sock);
  161. /* Razvan 2008-03: name the thread for debugging*/
  162. httpServThread.setName("CyberHttpServ"+httpServThread.getName());
  163. httpServThread.setDaemon(true);
  164. httpServThread.start();
  165. Debug.message("httpServThread ...");
  166. }
  167. }
  168. public boolean start()
  169. {
  170. httpServerThread = new Thread(this);
  171. /* Razvan 2008-03: name the thread for debugging*/
  172. httpServerThread.setName("CyberHttpServer"+httpServerThread.getName());
  173. httpServerThread.start();
  174. return true;
  175. }
  176. public boolean stop()
  177. {
  178. httpServerThread = null;
  179. return true;
  180. }
  181. }