当前位置: 代码迷 >> Web前端 >> 可能是世界下最简单的web server的java实现 (源码)
  详细解决方案

可能是世界下最简单的web server的java实现 (源码)

热度:182   发布时间:2012-10-06 17:34:01.0
可能是世界上最简单的web server的java实现 (源码)
J2EE 写了好些年,各种web容器都多多少少用过,却从未想过基本的web server是如何实现的。网上的文章多重于实用,官方文档又过于繁杂,若非机缘巧合,又怎想得到,神秘的web server,实现起来竟是如此简单!

首先,创建一个线程类,每个线程独立处理一个web browser request:
import java.io.*;
import java.net.*;

class WebServerConnection extends Thread {
  Socket connection;
  public WebServerConnection(Socket connection) {
    super();
    this.connection = connection;
    this.setName("Request No. " + this.getId());
  }

  @Override
  public void run() {
    Writer response = null;
    try {
      Thread.sleep(1000);
      response = new OutputStreamWriter(connection.getOutputStream());
      response.write(this.getName(), 0, this.getName().length());
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        response.close();
        connection.close();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
}

一个简单的请求处理器就这样完成了,它的动作很简单,对任何一个浏览器请求,它的回应都是自己的线程名。接下来要跑一个daemon进程,监听一切来自9090端口的请求,每到达一个请求,都创建一个WebServerConnection线程去处理,然后继续监听端口。该进程只能处理一共threadLimit那么多的请求,数量一到,server 宕掉:
import java.net.*;

public class WebServer {
    public static void main(String[] args) {
        try {
            int threadLimit = 5;
            int threadCounter = 0;
            ServerSocket sock = new ServerSocket(9090);
            while ((threadCounter++) < threadLimit) {
                //阻塞进程,直到新的request被侦测到
                Socket connection = sock.accept();
                //创建处理线程
                Thread connect = new WebServerConnection(connection);
                connect.start();
            }
            System.out.println("limit reached, server down!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


运行WebServer,然后在浏览器里输入http://localhost:9090,怎样,看到线程名了不是?多刷几次试试?
  相关解决方案