用JAVA实现一个简单地Http服务器
jopen
11年前
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); } } }