Java写简单HTTP服务器

目前一共三个类,主类:WebServer.java;工具类:Response.java、Request.java。今天先把代码贴着,过些天有时间了再来写这篇博文。



WebServer.java

package com.webserver.server;
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;
import java.net.UnknownHostException;

import com.webserver.util.*;

//function:begin socketServer,ZuSe server,receive socket,JieXi request,ChuangJian request,do response
public class WebServer {
	private boolean shutdown = false;
	public static final String WEB_ROOT = System.getProperty("user.dir")
			+ File.separator+ "WebRoot";//webroot
	public static final String SHUTDOWN_COMMAND = "/SHUTDOWN";
	public void await() {
		//STEP 1:build ServerSocket and listen the port 9898
		ServerSocket serverSocket = null;
		int port = 9898;
		try {
			serverSocket = new ServerSocket(port, 1,InetAddress.getByName("127.0.0.1"));
			System.out.println("Started and waiting...");
		} catch (IOException e0) {
			e0.printStackTrace();
		}
		//STEP 2:build a loop of socket server's method named accept()
		while(!shutdown) {
			Socket server = null;
			InputStream in = null;
			OutputStream out = null;
			try {
				server = serverSocket.accept();
				in = server.getInputStream();
				out = server.getOutputStream();
				//STEP 3:build "request",JieXi "request"
				Request req = new Request(in);
				req.parseRequest();
				//STEP 4:build "response"
				Response response = new Response(out);
				response.setRequest(req);
				//STEP 5:send simple static resource,close the socket
				response.sendStaticRes();
				server.close();
				shutdown = req.getUri().equals(SHUTDOWN_COMMAND);
			} catch (IOException e2) {
				e2.printStackTrace();
			}
		}
	}
	public static void main(String[] args) throws UnknownHostException {
		new WebServer().await();
	}
}<span style="color:#990000;">
</span>



Response.java

package com.webserver.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import com.webserver.server.WebServer;

/**
 * HTTP/1.1 200 OK
 * Date: Sat,31 Dec 2005 23:59:59 GMT
 * Content-Type: text/html;charset=ISO-8859-1
 * Content-Length: 122
 */

public class Response {
	private OutputStream out = null;
	private Request req = null;
	public Response(OutputStream out) {
		this.out = out;
	}
	public void setRequest(Request req) {
		this.req = req;
	}
	public void sendStaticRes() throws IOException {
		FileInputStream fis = null;
		try {
			File staticFile = new File(WebServer.WEB_ROOT, req.getUri());
			if(staticFile.exists()) {
				fis = new FileInputStream(staticFile);
				int i = 0;
				byte[] bbuf = new byte[1024];
				while((i = fis.read(bbuf, 0, 1024)) != -1) {//Get the data from fis to the byte[] named bbuf.
					out.write(bbuf, 0, i);//Write bytes from the byte[] named bbuf to this output stream.
				}
			} else {
				//file not found 404
				String errorMsg = "HTTP/1.1 404 File Not Found\r\n"+ 
						"Content-Type: text/html\r\nContent-Length: 23\r\n"+ 
						"\r\n<h1>File Not Found</h1>";
				out.write(errorMsg.getBytes());//Write error message to this output stream.
			}
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			if(fis != null) {
				fis.close();
			}
			fis = null;
		}
	}
}<span style="color:#990000;">
</span>



Request.java

package com.webserver.util;
import java.io.IOException;
import java.io.InputStream;

/**
 * GET /index.html HTTP/1.1
 * Accept: text/html,application/xhtml+xml,*//*
 * Accept-Language: zh-CN
 * User-Agent: Mozilla/5.0(Windows NT 6.3;WOW64;Trident/7.0;MALCJS;rv:11.0) like Gecko
 * Accept-Encoding: gzip,deflate
 * Host: localhost:9898
 * DNT: 1
 * Connection: Keep-Alive
 * Cookie: ...
 * Session: ...
 * JsessionId: ...
 */

//function:JieXi input stream,and FengZhuangCheng Request
public class Request {
	private InputStream in = null;
	private String uri = null;
	public Request(InputStream in) {
		this.in = in;
	}
	public void parseRequest() {
		StringBuffer sbuf = new StringBuffer(2048);
		byte[] bbuf = new byte[2048];
		int i;
		try {
			i = in.read(bbuf);
		} catch(IOException e) {
			e.printStackTrace();
			i = -1;
		}
		for(int j= 0; j<i; j++) {
			sbuf.append((char)bbuf[j]);
		}
		System.out.println(sbuf.toString());
		uri = parseUri(sbuf.toString());
	}
	private String parseUri(String reqStr) {
		int index1, index2;
		index1 = reqStr.indexOf("GET /");
		if(index1 != -1) {
			index2 = reqStr.indexOf("HTTP/", index1+ 1);
			if(index2 > index1) {
				return reqStr.substring(index1+ 4, index2).trim();
			}
		}
		return null;
	}
	public String getUri() {
		return uri;
	}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值