前面分别介绍了Http的请求响应,以及Socket的通信,现在整合起来,看请求响应怎么通过Socket来交互通信。
我们通过下面一个简单ServerSocket的应用,来把Request和Response融入到Socket的传输通信中。
/**
*模拟简单的服务器端
*/
public class SimpleHttpServer {
public static void main(String[] arg) {
String SHUTDOWM ="SHUTDOWN";
ServerSocket serverSocket =null;
InputStream input =null;
OutputStream output =null;
try {
serverSocket = new ServerSocket(8000, 1, InetAddress.getByName("127.0.0.1"));
while (true) {// 循环监听,接收请求
Socket socket =serverSocket.accept();
input =socket.getInputStream();
output =socket.getOutputStream();
// 根据接收到的Socket流,创建请求和响应Request/ Response
Request request =new Request(input);
Response response =new Response(output);
// 处理,并返回
String deal ="Hello World";
response.sendStaticResource(deal);
socket.close();
// 如果收到停止的命令,则跳出循环,关闭Server
if (SHUTDOWM.equals(request.getURI())) {
break;
}
}
}
catch (IOException e) {
e.printStackTrace();
} finally {
// 各种close,此处省略
}
}
}
此处ServerSocket把接收到的Socket流,转换成Request对象,进行处理,并把响应流转换成Response对象。
为什么要这么做呢?这是把请求流和响应流结构化,方便后面的解析和处理,因为后面的处理(Servlet等)都是基于标准的HttpRequest和HttpResponse对象的。这也是统一化标准化的体现。
此处的Request和Response都只是为了体现和Socket的关系,所以非常简单。
/**
*模拟请求类
*/
class Request {
public Request(InputStream in) {}
public String getURI() {
return null;
}
}
/**
*模拟响应类
*/
class Response {
private OutputStream out = null;
public Response(OutputStream out) {
this.out = out;
}
public void sendStaticResource(String strOut) {
PrintWriter output =new PrintWriter(new BufferedWriter(newOutputStreamWriter(out)), true);
output.println(strOut);
}
}
【Tomcat|初探Tomcat源码 (3) —— SimpleHttpServer】 — — 参考《How Tomcat Works》
推荐阅读
- jar|springboot项目打成jar包和war包,并部署(快速打包部署)
- tomcat|tomcat配置多个项目的server.xml的配置
- intellij-idea|JavaWeb: IntelliJ IDEA集成开发环境下开发第一个servlet程序(JDBC)Tomcat
- Tomcat配置图片保存路径,图片不保存在项目路径下
- Android源码|okhttp源码分析(一)——基本流程(超详细)
- Git|Tomcat 自定义错误页面(例如404页面等等)
- Android|App启动(一)Application的创建
- eclipse 指定文件上传到tomcat的路径
- Android|Flutter的绘制流程简述
- Tomcat|Tomat之——多项目jar包共享配置