用JAVA實現一個簡單地Http服務器

jopen 10年前發布 | 33K 次閱讀 Web服務器 Java
    import java.io.FileInputStream;  
    import java.io.IOException;  
    import java.net.InetSocketAddress;  
    import java.net.Socket;  
    import java.nio.ByteBuffer;  
    import java.nio.CharBuffer;  
    import java.nio.channels.FileChannel;  
    import java.nio.channels.ServerSocketChannel;  
    import java.nio.channels.SocketChannel;  
    import java.nio.charset.Charset;  
    import java.util.concurrent.ExecutorService;  
    import java.util.concurrent.Executors;  

    public class SimpleHttpServer {  

            private int port=8080;  
          private ServerSocketChannel serverSocketChannel = null;  
          private ExecutorService executorService;  
          private static final int POOL_MULTIPLE = 4;  

          public SimpleHttpServer() throws IOException {  
            executorService= Executors.newFixedThreadPool(  
                Runtime.getRuntime().availableProcessors() * POOL_MULTIPLE);  
            serverSocketChannel= ServerSocketChannel.open();  
            serverSocketChannel.socket().setReuseAddress(true);  
            serverSocketChannel.socket().bind(new InetSocketAddress(port));  
            System.out.println("ddd");  
          }  

          public void service() {  
            while (true) {  
              SocketChannel socketChannel=null;  
              try {  
                socketChannel = serverSocketChannel.accept();  
                executorService.execute(new Handler(socketChannel));  
              }catch (IOException e) {  
                 e.printStackTrace();  
              }  
            }  
          }  

          public static void main(String args[])throws IOException {  
            new SimpleHttpServer().service();  
          }  
          class Handler implements Runnable{  
          private SocketChannel socketChannel;  
          public Handler(SocketChannel socketChannel){  
            this.socketChannel=socketChannel;  
          }  
          public void run(){  
            handle(socketChannel);  
          }  

          public void handle(SocketChannel socketChannel){  
            try {  
                Socket socket=socketChannel.socket();  
                System.out.println("ddd" +  
                socket.getInetAddress() + ":" +socket.getPort());  

                 ByteBuffer buffer=ByteBuffer.allocate(1024);  
                 socketChannel.read(buffer);  
                 buffer.flip();  
                 String request=decode(buffer);  
                 System.out.print(request);    

                 StringBuffer sb=new StringBuffer("HTTP/1.1 200 OK\r\n");  
                 sb.append("Content-Type:text/html\r\n\r\n");  
                 socketChannel.write(encode(sb.toString()));  

                 FileInputStream in;  

                 String firstLineOfRequest=request.substring(0,request.indexOf("\r\n"));  
                 if(firstLineOfRequest.indexOf("login.htm")!=-1)  
                    in=new FileInputStream("/Users/tokou/Documents/post.html");  
                 else  
                    in=new FileInputStream("/Users/tokou/Documents/post.html");  

                 FileChannel fileChannel=in.getChannel();  
                 fileChannel.transferTo(0,fileChannel.size(),socketChannel);  
                 fileChannel.close();  
              }catch (Exception e) {  
                 e.printStackTrace();  
              }finally {  
                 try{  
                   if(socketChannel!=null)socketChannel.close();  
                 }catch (IOException e) {e.printStackTrace();}  
              }  
          }  
          private Charset charset=Charset.forName("GBK");  
          public String decode(ByteBuffer buffer){    
            CharBuffer charBuffer= charset.decode(buffer);  
            return charBuffer.toString();  
          }  
          public ByteBuffer encode(String str){    
            return charset.encode(str);  
          }  
         }  
    }  
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!