方槍槍的java世界

          不要因為風(fēng)雨飄落就停止了你的腳步,真正的得失就在你的心中。 做喜歡做的事,不輕言放棄!

          01 一個簡單的HttpServer_SimpleHttpServer_Constant

           

          package com.tianhe.frm.http;

          public interface Constant
          {

             public static String CONTENT_LENGTH = "Content-Length:";   
          }


          package com.tianhe.frm.http;

          import java.io.BufferedReader;
          import java.io.IOException;
          import java.io.InputStreamReader;
          import java.io.PrintStream;
          import java.net.ServerSocket;
          import java.net.Socket;
          import java.net.URLDecoder;
          import java.util.StringTokenizer;

          import org.apache.log4j.Logger;

          import com.tianhe.frm.context.GlobalConfig;
          import com.tianhe.frm.exception.OurRuntimeException;
          import com.tianhe.frm.utils.LogUtil;
          import com.tianhe.frm.utils.ObjectUtil;
          import com.tianhe.frm.utils.StringUtil;

          public class SimpleHttpServer implements Runnable
          {
              private boolean debug = false;
             
              private String charset = "gbk";
             
              private ServerSocket serverSocket;// 服務(wù)器Socket
             
              private static Processor processor = null;
             
              public SimpleHttpServer(int port, String charset, boolean debug)
              {
                  this.debug = debug;
                 
                  if (StringUtil.isNotEmpty(charset))
                  {
                      this.charset = charset;
                  }
                 
                  this.serverSocket = createServerSocket(port);
                  if (this.serverSocket != null)
                  {
                      new Thread(this).start();
                      System.out.println("SimpleHttpServer is running, port=" + port + ",charset=" + charset + ",debug=" + debug);
                  }
              }
             
              private ServerSocket createServerSocket(int port)
              {
                  ServerSocket ss = null;
                 
                  try
                  {
                      ss = new ServerSocket(port);
                  }
                  catch (IOException e)
                  {
                      throw new OurRuntimeException("createServerSocket failed", e);
                  }
                  return ss;
              }
             
              public void run()
              {
                  while (true)
                  {
                      try
                      {
                          Socket socket = serverSocket.accept();
                          new Thread(new ServerHandler(socket)).start();
                      }
                      catch (IOException e)
                      {
                          getLog().error("SimpleHttpServer run error", e);
                      }
                     
                  }
              }
             
              class ServerHandler implements Runnable
              {
                  private Socket socket;
                 
                  ServerHandler(Socket socket)
                  {
                      this.socket = socket;
                  }
                 
                  public void run()
                  {
                      try
                      {
                          boolean firstFlag = false;
                          String resource = "";
                          String method = "";
                          int len = 0;
                         
                          StringBuffer sb = new StringBuffer();
                          String line;
                          BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                          while ((line = in.readLine()) != null)
                          {
                              sb.append(line).append("\n");
                             
                              if (!firstFlag)
                              {
                                  resource = line.substring(line.indexOf('/') + 1, line.lastIndexOf('/') - 5);
                                  resource = URLDecoder.decode(resource, charset);// 反編碼 URL
                                 
                                  method = new StringTokenizer(line).nextElement().toString();// 獲取請求方法, GET 或者 POST
                                  firstFlag = true;
                              }
                             
                              if (line.startsWith(Constant.CONTENT_LENGTH))
                              {
                                  len = Integer.valueOf(line.substring(Constant.CONTENT_LENGTH.length()));
                              }
                             
                              if (line.equals(""))
                                  break;
                          }
                         
                          // 顯示 POST 表單提交的內(nèi)容, 這個內(nèi)容位于請求的主體部分
                          char[] reqData = null;
                          if ("POST".equalsIgnoreCase(method) && len > 0)
                          {
                              reqData = new char[len];
                              in.read(reqData);
                              sb.append(new String(reqData)).append("\n");
                          }
                         
                          String requestString = sb.toString();
                          System.out.println("-------------------------begin----------------------------");
                          System.out.println(requestString);
                          System.out.println("-------------------------end------------------------------");
                         
                          byte[] resData = processRequest(resource, reqData, charset);
                          writeResponse(resource, resData, socket);
                      }
                      catch (IOException e)
                      {
                          throw new OurRuntimeException("ServerHandler run error", e);
                      }
                      finally
                      {
                          closeSocket(socket);
                      }
                  }
              }
             
              public byte[] processRequest(String resource, char[] data, String charset)
              {
                  if (processor == null)
                  {
                      String clazzName = GlobalConfig.getString("ProcessorImpl.CLASS_NAME", "com.tianhe.frm.http.ProcessorImpl");
                      processor = (Processor)ObjectUtil.createObject(clazzName);
                  }
                 
                  byte[] resData = processor.process(resource, data, charset);
                  return resData;
              }
             
              private void writeResponse(String resource, byte[] resData, Socket socket)
              {
                  try
                  {
                      PrintStream out = new PrintStream(socket.getOutputStream(), true);
                      out.println("HTTP/1.0 200 OK");
                      out.println("Content-Type:text/html;charset=" + charset);
                      if (resData != null)
                      {
                          out.println("Content-Length:" + resData.length);
                          out.println();
                          out.write(resData);
                      }
                      else
                      {
                          out.println("Content-Length: 0");
                          out.println();
                      }
                  }
                  catch (IOException e)
                  {
                      e.printStackTrace();
                  }
              }
             
              void closeSocket(Socket socket)
              {
                  try
                  {
                      if (socket != null)
                      {
                          socket.close();
                      }
                  }
                  catch (IOException ex)
                  {
                      ex.printStackTrace();
                  }
              }
             
              private Logger getLog()
              {
                  return LogUtil.getLog(getClass());
              }
             
              private static void usage()
              {
                  System.out.println("Usage: java SimpleHttpServer -port 8080 -charset gbk -debug");
              }
             
              public static void main(String[] args)
              {
                  try
                  {
                      String charset = "GBK";
                      int port = 8080;
                      boolean debug = false;
                     
                      if (args != null && args.length > 0)
                      {
                          for (int i = 0; i < args.length; i++)
                          {
                             
                              if (args[i].startsWith("-port"))
                              {
                                  port = Integer.valueOf(args[i + 1]);
                                  i++;
                              }
                             
                              if (args[i].startsWith("-charset"))
                              {
                                  charset = args[i + 1];
                                  i++;
                              }
                             
                              if (args[i].startsWith("-debug"))
                              {
                                  debug = true;
                                  // i++;
                              }
                             
                              if (args[i].equalsIgnoreCase("-help"))
                              {
                                  usage();
                                  System.exit(0);
                              }
                          }
                      }
                     
                      new SimpleHttpServer(port, charset, debug);
                  }
                  catch (OurRuntimeException ex)
                  {
                      ex.printStackTrace();
                  }
                 
              }
          }

          posted on 2012-07-09 22:11 做強(qiáng)大的自己 閱讀(222) 評論(0)  編輯  收藏 所屬分類: Socket

          主站蜘蛛池模板: 连平县| 邳州市| 宿松县| 尼木县| 腾冲县| 昌宁县| 仙居县| 西安市| 兴隆县| 岱山县| 临安市| 宜都市| 新田县| 洛阳市| 惠东县| 长岛县| 普兰店市| 祁东县| 铁力市| 庄河市| 迁安市| 阿合奇县| 根河市| 乐都县| 武定县| 都昌县| 鄂伦春自治旗| 垦利县| 木里| 自治县| 饶河县| 唐河县| 邢台县| 永康市| 曲阜市| 建始县| 剑河县| 两当县| 翼城县| 台州市| 苏尼特左旗|