How Tomcat Works, A Guide to Developing Your Own Java Servlet Container

1.1 socket网络通信基础

客户端使用主机地址和端口实例化一个socket,此socket通过输出流将字符串等传向服务器主机。

服务器使用端口号实例化一个serverSocket,调用accept()方法监听此端口,等待客户端的连接。一旦连接成功,就可以获取到输入流,将客户端通过网络发送的字符串读取到;也可以获取输出流,将自己的反馈信息发给客户端(客户端获取输入流就可以读到反馈信息)。

ServerSocket serverSocket = new ServerSocket("8080",1,"客户机1");
Socket socket = serverSocket.accept();
input = socket.getInputStream();
// 处理
// ...
output = socket.getOutputStream();

1.2 Http服务器的原理

http服务器就是通过以上介绍的原理来接收HTTP请求的,只是它接收到的是完全按照http协议格式的请求字符串。在服务器被连接(accept())后,就可以获得输入流和输出流,使用它们可以实例化一个请求和一个响应对象。

ServerSocket serverSocket = new ServerSocket("8080",1,"客户机1");
Socket socket = serverSocket.accept();

input = socket.getInputStream();

Request request = new Request(input);

service(request,response);

output = socket.getOutputStream();

Response response = new Response(output);

1.3 Request类

Request类要做的事情就是从输入流中接收字符串,并将一个完全符合http协议的请求字符串分解为一个Request对象。

根据上图,使用indexOf()以及subString()等方法就可以将字符串分解,并将各部分的值封装在Request对象中。

1.4 Response类

Response类需要将响应的字符串按照http响应的格式写到输出流中去。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏你不就像风一样

Tomcat完美配置多个HOST主机,域名,SSL

1193
来自专栏Golang语言社区

即时通讯软件可以用GO语言实现吗

四个方面特点: 1. 并发支持 对于及时通讯、网络编程等方面,并发支持一定是并不可少的。 goroutine,用户态"线程",大家所说的协程,支持并发操作。已经...

28210
来自专栏有趣的django

Flask请求扩展和数据库连接池

2230
来自专栏lgp20151222

idea+jsp+jstl c标签页面异常

把这两个包分别加到项目依赖库,生成的tomcat的war文件(即WEB-INF文件)的lib目录下,还有tomcat自己的lib

942
来自专栏专栏

跨环境测试框架介绍-pytest的高级用法

本文将介绍针对测试和生产等不同测试环境下,维护一套可读性,追溯性强的测试用例的工具-pytest。

1224
来自专栏扎心了老铁

python codis集群客户端(一) - 基于客户端daemon探活与服务列表维护

在使用codis时候,我们遇到的场景是,公司提供了HA的Proxy(例如N个),但是不暴露zookeeper(也就是说没有codis后端服务列表)。 如果暴露z...

53410
来自专栏C/C++基础

进程与线程的区别

在开发工作中,尤其是对负载较大的服务端程序的开发,为充分发挥处理器多核性能,提高硬件资源利用率,增加系统吞吐量,少不了并发编程。并发编程一般通过多进程和多线程的...

713
来自专栏JMCui

多线程编程学习一(Java多线程的基础).

一、进程和线程的概念 进程:一次程序的执行称为一个进程,每个 进程有独立的代码和数据空间,进程间切换的开销比较大,一个进程包含1—n个线程。进程是资源分享的最小...

3247
来自专栏行者悟空

Hadoop之RPC机制

771
来自专栏coding

Linux命令帮助文档

1082

扫码关注云+社区