模拟一下tomcat

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();//创建对象
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值