import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.Buffer;
/**
* 模拟tomcat 接收http协议 并处理
*/
public class Server {
private ServerSocket server;
public Server() {
// TODO Auto-generated constructor stub
try {
/**
* Socket是一个基于TCP/IP协议的套接字功能
* 我们就可以用Socket模拟出HTTP协议
* 只要监听80端口就行了!
*/
server = new ServerSocket(8088);
System.out.println("服务器启动成功!");
this.start();
server.close();
System.out.println("start调用完毕!");
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("服务器创建失败,可能是端口占用");
}
}
/**
* 这是一个监听启动方法
*/
private void start(){
try {
//接收客端的一个请求,这句代码只接收了一次请求
//把请求的信息都封装到了inputStream流中
Socket socket=server.accept();
//低级-字节流 InputStream
InputStream in = socket.getInputStream();
//字节转字符的转换流
InputStreamReader ir = new InputStreamReader(in);
//高级-缓冲字符流 BufferedReader
BufferedReader br = new BufferedReader(ir);
String str = null;
/* while((str=br.readLine()) != null){
System.out.println(str);
}*/
str = br.readLine(); //只读一行 这是请求行
String method=str.split(" ")[0]; //请求方式
System.out.println(str+"请求方式是: "+method);
String uri=str.split(" ")[1]; //请求资源路径
//给客户端发响应,响应发到outputStream
//输出字节流
OutputStream os = socket.getOutputStream();
//将输出字节流转换成输出字符流
OutputStreamWriter w = new OutputStreamWriter(os,"GBK");
//字符流转换成输出的高级缓冲字符流
PrintWriter pw = new PrintWriter(w);
//String sss = "<html><head></head><body>this is baidu index <br> 这是百度首页</body></html>";
File file = new File("index.html");
pw.println("HTTP"
+ "/1.1 200 OK "); //状态行
pw.println("Content-Type: text/html;Charset=GBK");//消息头
//pw.println("Content-Length: "+String.valueOf(sss.length()-4));
pw.println("Content-Length: "+file.length());// 消息头 字节长度
pw.println(); //消息头结束
if("/".equals(uri)){ //表示网站根目录
BufferedReader r= new BufferedReader(new InputStreamReader(new FileInputStream(file),"GBK"));
//pw.println(sss);
String tmp=null;
while((tmp=r.readLine())!=null){
pw.println(tmp);
}
}
pw.flush();//刷新缓冲流
pw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* java se的入口函数
* */
public static void main(String[] args) {
// TODO Auto-generated method stub
new Server();//创建对象
}
}