web应用服务器工作原理

web服务软件的原型可以从最初的web服务软件初衷说起:

最初的web服务器程序就是一个利用浏览器和web服务软件之间的关系,将存储在硬盘上的文件传递给远程的读者的。

 

web服务器软件主要是提供web服务的软件。它无非就的是把硬盘上的文件以html格式数据流的型式提供给web浏览器。

 

web服务器的作用和原理:

 

需要传递的硬盘上的文件的格式是html格式的标记性语言的文件,web服务器软件在接收到浏览器的访问请求时,将直接不加任何修改地将这个html文件传递到远程浏览器,传输协议是TCP的HTTP协议。

对于JSP的传达,其流程:

JSP文件→JAVA文件→CLASS文件→运行时返回HTML数据格式→web服务器软件→网络→浏览器

自制简单的webserver:

 

1、HttpServer类:确定以TCP协议为服务传输协议。

在8000端口创建服务端套接字,建立一个套接字以死循环的形式监听端口

 

package cn.com.yy.webserver;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * @author yeyong
 * 确定以TCP作为服务传输协议
 */
public class HttpServer {
 public static String ROOT = "./webroot";
 public static String defaultPage = "index.html";
 public static void main(String[] args) throws IOException {
  // TODO Auto-generated method stub
  ServerSocket server = new ServerSocket(8000);
  while(true){
   //阻塞,等待浏览器连接
   Socket sk = server.accept();
   System.out.println("Accepting Connection.../n");
   //启动服务线程
   new HttpThread(sk).start();
  }
 }
}

2、实现一个多线程,处理每个用户请求。

package cn.com.yy.webserver;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
 * @author yeyong
 * 实现一个多线程程序,用于处理每一个用户请求
 */
class HttpThread extends Thread {
 private Socket socket;
 HttpThread(Socket sk){
  this.socket = sk;
 }
 public void run(){
  InputStream ins = null;
  OutputStream outs = null;
  try{
   ins = socket.getInputStream();
   outs = socket.getOutputStream();
   Receive rcv = new Receive(ins);
   String sURL = rcv.parse();//用Recevie类取得浏览器发过来的URL请求
   System.out.println("sURL: " + sURL);
   if(sURL.equals("/")){
    sURL = HttpServer.defaultPage;//如果没有指定文件,那么传来的URL加上默认文件名
   }
   Answer ans = new Answer(outs);//用Answer类将sURL执行的文件返回给浏览器
   ans.send(sURL);
  }catch(IOException e){
   e.printStackTrace();
   System.out.println(e);
  }finally{
   //释放资源
   try{
    if(ins != null) ins.close();
    if(outs != null) outs.close();
    if(socket != null) socket.close();
   }catch(IOException e){
    e.printStackTrace();
    System.out.println(e);
   }
  }
 }
}

 

3、取得浏览器传来的URL

Receive类:

package cn.com.yy.webserver;

import java.io.IOException;
import java.io.InputStream;
/**
 * @author yeyong
 * 取得浏览器传来的URL
 */
public class Receive {
 InputStream in = null;
 public Receive(InputStream input){
  this.in = input;
 }
 //这个方法的目的是将URL请求的文件返回
 public String parse(){
  StringBuffer receiveStr = new StringBuffer(2048);
  int i;
  byte[] buffer = new byte[2048];
  try{
   i = in.read(buffer);//从socket读出数据
  }catch(IOException e){
   e.printStackTrace();
   i = -1;
  }
  for(int j = 0;j < i;j++){
   receiveStr.append((char)buffer[j]);//将取得的信息循环追加到receiveStr变量
  }
  System.out.println("receiveStr: " + receiveStr.toString());
  return getUri(receiveStr.toString());
 }
 
 //用getUri方法将收到的HTTP协议数据包分解,取出文件名的描述URL
 private String getUri(String receiveStr){
  int index1,index2;
  index1 = receiveStr.indexOf(' ');
  if(index1 != -1){
   index2 = receiveStr.indexOf(' ',index1 + 1);
   if(index2 > index1){
    return receiveStr.substring(index1 + 1,index2);
   }
  }
  System.out.println("getUri return null");
  return null;
 }
}

 

4、返回HTTP数据流

Answer类:

 

package cn.com.yy.webserver;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
 * @author yeyong
 * 返回HTTP数据流
 */
public class Answer {
 OutputStream out = null;
 public Answer(OutputStream output){
  this.out = output;
 }
 public void send(String pagefile){
  //这个方法是关键,其目的是返回HTTP数据流
  byte[] bytes = new byte[2048];
  FileInputStream fis = null;
  try{
   File file = new File(HttpServer.ROOT,pagefile);
   if(file.exists()){//文件存在
    fis = new FileInputStream(file);
    int ch = fis.read(bytes,0,2048);
    String sBody = new String(bytes,0);
    //返回的信息是在文件内容前加上HTTP协议的格式内容
    String sendMessage = "HTTP/1.1 200 OK/r/n" +
     "Content-Type:text/html/r/n" +
     "Content-Length: " + ch + "/r/n" +
     "/r/n" + sBody;
    out.write(sendMessage.getBytes());
   }else{//文件不存在的话,返回一个HTTP协议格式内容
    String errorMessage = "HTTP/1.1.404 File Not Found/r/n" +
     "Content-Type: text/html/r/n" +
     "Content-Length: 23/r/n" +
     "/r/n" +
     "<h1>File Not Found</h1>";
    out.write(errorMessage.getBytes());
   }
  }catch(IOException e){
   e.printStackTrace();
  }finally{
   if(fis != null)
    try {
     fis.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
  }
 }
}

 

执行HttpServer主程序,在浏览器URL栏输入 http://localhost:8000/index.html

 

在工程src上级目录下建立 webroot目录,写好你的index.html文件。

 

即会请求到index.html文件。

 

amazing!!!!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值