java实现一个最简单的tomcat服务

1.如何启动?

main方法是程序的入口,tomcat也不例外,在tomcat中,是通过Bootstrap 类中main方法启动tomcat服务的;

2.建立连接

要通讯,必须要建议socket连接,我们需要使用哪种socket,是根据它使用的哪种协议进行判断的。tcp协议or udp协议?http协议本身属于tcp协议,因此我们选择的socket是基本tcp协议的socket。在tomcat中,StandardServer 中 await() 方法具体实现了 socket连接;

3.io模式

BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高;

NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器;

AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器

tomcat 使用了io,bio、nio、apr三种io模式,它们不同的应用各自发挥其优点。这里通过bio简单实现一个tomcat服务。

代码示例:

public class Server {

	public static void main(String[] args) throws IOException {
		new Server().start();
	}

	public void start() throws IOException {
		ServerSocket serverSocket = new ServerSocket(8888);
		Socket socket = null;
		System.out.println("启动web服务");
		while (true) {
			socket = serverSocket.accept();
			Thread thread = new Thread(new HttpServerThread(socket));
			thread.start();
		}
	}

	// 内部类
	private class HttpServerThread implements Runnable {
		Socket socket = null;

		HttpServerThread(Socket socket) {
			this.socket = socket;
		}

		@Override
		public void run() {
			InputStream is = null;
			OutputStream os = null;
			BufferedReader br = null;
			try {
				is = this.socket.getInputStream();
				os = this.socket.getOutputStream();
				
				// 页面的请求
				br = new BufferedReader(new InputStreamReader(is));
				String line = br.readLine();
				int i = 0;
				while (null != line && br.ready()) {
					line = br.readLine();
					System.out.println("第" + i + "行信息:" + line);
					i++;
				}

				// 页面的响应
				String reply = "HTTP/1.1\n"; 			// 必须添加的响应头
				reply += "Content-type:text/html\n\n"; 	   // 必须添加的响应头
				reply += "服务器返回的消息";
				os.write(reply.getBytes());
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					os.close();
					is.close();
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

 

在浏览器上输入:http://localhost:8888/

控制台输出:

第0行信息:Host: localhost:8888

第1行信息:Connection: keep-alive

第2行信息:Cache-Control: max-age=0

第3行信息:User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36

第4行信息:Upgrade-Insecure-Requests: 1

第6行信息:Accept-Encoding: gzip, deflate, br

第5行信息:Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

第8行信息:Cookie: SYS_COOKIE_USER_URID=admin; SYS_COOKIE_USER_DESC="admin<||>admin<||>c2150f954718469e878aa9776d8598a2<||><||>1<||>ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U=<||>1516866191246"; SYS_COOKIE_USER_URIDDEC=570cc49708310e29; SYS_COOKIE_USER_ROLES_ID=c2150f954718469e878aa9776d8598a2; SYS_COOKIE_LOGINTIME=1516866191246; JSESSIONID=F373E4FD1D4E6E57AB618563B796B909; EDU_COOKIE_RANDOMCODE=0c688b13d12e84395379ce703b450375

第7行信息:Accept-Language: zh-CN,zh;q=0.9

第9行信息:

控制台上的输出包含http请求头信息,socket接收的流格式为字符类型,每一行都代表一种类型的信息,因此解析时需要逐行解析。之前使用BufferedReader的readLine( )方法,但是此方法是阻塞线程的,如果读取不到,会一直处理等待状态,因此配合ready( )方法一起使用。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值