Server.java经过改进,当接收到客户端的请求时,返回一个手工拼接的响应。
代码如下
package mywebserver2;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.StringTokenizer;
/**
* @author allen
* @version 0.2
*/
public class Server {
public static void main(String[] args) {
StringBuilder responseHead = new StringBuilder();
StringBuilder responseBody = new StringBuilder();
// 拼接响应头
responseHead.append("HTTP/1.1 200 OK");
responseHead.append("/n");
responseHead.append("Server: AllenWebServer");
responseHead.append("/n");
// 拼接响应体,简单的Html文本
responseBody.append("<html");
responseBody.append("<body>Hello This Allen Server/n");
responseBody.append("</body></html>");
// 得到相应体的长度。
int bodylength = responseBody.toString().getBytes().length;
responseHead.append("Content-Length: " + bodylength);
responseHead.append("/n");
responseHead.append("/n");
System.out.println("响应头是:/n" + responseHead.toString());
System.out.println("响应体头是:/n" + responseBody.toString());
System.out.println("********************");
try {
ServerSocket ss = new ServerSocket(80);
Socket s = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(s
.getInputStream()));
String requestLine = "";
char[] body;
boolean haveBody = false;
int length = 0;
do {
requestLine = br.readLine();
System.out.println(requestLine);
// post方式提交的请求还要取得,请求体的内容
if (requestLine.startsWith("Content-Length")) {
StringTokenizer st = new StringTokenizer(requestLine, ":");
st.nextToken();
String bodyLength = st.nextToken().trim();
length = Integer.parseInt(bodyLength);
haveBody = true;
}
if (requestLine.equals("") && haveBody) {
body = new char[length];
br.read(body, 0, length);
System.out.println(new String(body));
}
} while (!requestLine.equals(""));
// 开始响应
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s
.getOutputStream()));
bw.write(responseHead.toString());
bw.flush();
bw.write(responseBody.toString());
bw.flush();
br.close();
s.close();
ss.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 资源清理代码
}
}
}