一个简单Web服务器的实现(Java语言开发

要求:1.当一个客户(浏览器)联系时创建一个连接套接字
  2.从这个连接接受HTTP请求
          3.解释该请求以确定所请求的特定文件
          4.从服务器的文件系统获得请求的文件
          5.创建一个由请求的文件组成的HTTP响应报文,报文前面有首部行
          6.经TCP连接向请求的浏览器发送响应。如果浏览器在请求一个不存在的文件,服务器应当返回一个“404 Not Found”
程序执行思路:
1.创建一个ServerSocket对象
2.调用ServerSocket对象的accept方法,等待连接,连接成功返回一个Socket对象,否则一直阻塞等待。
3.从Socket对象中获取InputStream和OutputStream字节流,inputstream对应request请求,outputstream对应response响应。
4.处理请求:读取InputStream字节流信息,转换成字符串形式,并解析,获取uri信息
5.处理响应:根据解析出来的uri,从WEB_ROOT目录中寻找请求的资源文件,读取资源文件,将其写入到OutputStream字节流中
6.关闭Socket对象

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class HttpServer {
	//WEB_ROOT是html文件和其他文件存放的目录,这里的WEB_ROOT目录是工作目录下的webroot目录
	public static final String WEB_ROOT = System.getProperty("user.dir") + File.separator + "webroot";
	
	//关闭服务命令
	private static final String SHUTDOWN_COMMAND = "/SHUTDOWN";
	
	public static void main(String[] args){
		HttpServer server = new HttpServer();
		//等待连接请求
		server.await();
	}
	
	public void await(){
		ServerSocket serverSocket = null;
		int port = 8080;
		try{
			//服务器套接字对象
			serverSocket = new ServerSocket(port,1,InetAddress.getByName("127.0.0.1"));
		}catch(IOException e){
			e.printStackTrace();
			System.exit(1);
		}
		
		//循环等待请求
		while(true){
			Socket socket = null;
			InputStream input = null;
			OutputStream output = null;
			try{
				//等待连接,连接成功后,返回一个Socket对象
				socket = serverSocket.accept();
				input = socket.getInputStream();
				output = socket.getOutputStream();
				
				//创建Request对象并解析
				Request request = new Request(input);
				request.parse();
				
				//检查是否是关闭服务命令
				if(request.getUri().equals("SHUTDOWN_COMMAND")){
					break;
				}
				
				//创建Response对象
				Response response = new Response(output);
				response.setRequest(request);
				response.sendStaticResource();
				
				//关闭socket对象
				socket.close();
			}catch(Exception e){
				e.printStackTrace();
				continue;
			}
		}
	}
} 

import java.io.IOException;
import java.io.InputStream;

public class Request {
	private InputStream input;
	private String uri;
	
	public Request(InputStream input){
		this.input = input;
	}
	
	//从InputStream中读取request信息,并从request中获取uri值
	public void parse(){
		StringBuffer request = new StringBuffer(2048);
		int i;
		byte[] buffer = new byte[2048];
		try{
			i = input.read(buffer);
		}catch(IOException e){
			e.printStackTrace();
			i = -1;
		}
		
		for(int j = 0;j<i;j++){
			request.append((char)buffer[j]);
		}
		
		System.out.print(request.toString());
		uri = parseUri(request.toString());
		
	}
	
	private String parseUri(String requestString){
		int index1,index2;
		index1 = requestString.indexOf(' ');
		if(index1 != -1){
			index2 = requestString.indexOf(' ',index1 + 1);
			if(index2 > index1){
				return requestString.substring(index1 + 1,index2);
			}
		}
		return null;
	}
	
	public String getUri(){
		return uri;
	}
}

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

public class Response {
	private static final int BUFFER_SIZE = 1024;
	Request request;
	OutputStream output;
	
	public Response(OutputStream output){
		this.output = output;
	}
	
	public void setRequest(Request request){
		this.request = request;
	}
	
	public void sendStaticResource() throws IOException{
		byte[] bytes = new byte[BUFFER_SIZE];
		FileInputStream fis = null;
		try{
			//将web文件写入到OutputStream字节流中
			File file = new File(HttpServer.WEB_ROOT,request.getUri());
			if(file.exists()){
				fis = new FileInputStream(file);
				int ch = fis.read(bytes, 0, BUFFER_SIZE);
				while(ch != -1){
					output.write(bytes,0,ch);
					ch = fis.read(bytes, 0, BUFFER_SIZE);
				}
			}else{
				//file not found
				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> FileNotFound</h1>";
				output.write(errorMessage.getBytes());
			}
		}catch(Exception e){
			System.out.println(e.toString());
		}finally{
			if(fis != null)
				fis.close();
		}
	}
}

在工程目录ASimpleWebServer下建立一个webroot文件夹,存放一个index.html页面。
浏览器输入http://localhost:8080/index.html
即可出现 Welcome to my Web Server字样

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值