目前一共三个类,主类: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;
}
}