手写Tomcat之-HttpResponse(4)

这个博客介绍了如何实现一个HTTP响应对象,包括状态代码、状态描述、响应头和实体内容的设置。类`HttpResponse`接收Socket并创建输出流,用于向客户端发送HTTP响应。方法如`sendStatusLine()`、`sendHeaders()`和`sendContent()`分别处理状态行、响应头和响应正文的发送。此外,`setEntity()`方法设置响应实体并添加相关响应头。
摘要由CSDN通过智能技术生成
package com.webserver.http;

import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

响应对象
该类的每一个实例用于表示服务端发送给客户端的HTTP响应内容

public class HttpResponse {
    //状态代码,默认值为200
	private int statusCode=200;
	
    //状态描述,默认对应200的描述内容"OK"
	private String statusReason="OK";
	
	//key:响应头名字 value:响应头对应的值
	private Map<String,String>headers=new HashMap<>();
	
	//响应正文的实体文件
	private File entity;
	
    private Socket socket;
	private OutputStream out;

实例化请求对象的同时将Socket传入,以便当前响应
对象通过他来获取输出流给对应的客户端发送响应内容

public HttpResponse(Socket socket) {
		try {
			this.socket=socket;
			this.out=socket.getOutputStream();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

用于将当前响应对象的内容以一个HTTP响应格式送给客户端

public void flush() {
		//顺序发送响应的三部分
		sendStatusLine();
		sendHeaders();
		sendContent();
	}

发送状态行

private void sendStatusLine() {
		try {
			String line="HTTP/1.1"+" "+statusCode+" "+statusReason;
			out.write(line.getBytes("ISO8859-1"));
			out.write(13);
			out.write(10);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

发送响应头

private void sendHeaders() {
		try {
			/*
			 * 通过遍历headers,将所有需要发送给客户端的
			 * 响应头进行发送
			 */
			
			Set<Entry<String,String>> entrySet=headers.entrySet();
			
			for(Entry<String,String>e: entrySet) {
				String name=e.getKey();
				String value=e.getValue();
				String line=name+": "+value;
				out.write(line.getBytes("ISO8859-1"));
				out.write(13);
				out.write(10);
			}
			//单独发送CRLF表示响应头部分发送完毕
			out.write(13);
			out.write(10);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

发送响应正文

private void sendContent() {
		if(entity!=null) {
			try(
					FileInputStream fis=new FileInputStream(entity)
					){
				int len=-1;
				byte[]data=new byte[1024*10];
				while((len=fis.read(data))!=-1) {
					out.write(data,0,len);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

将给定的实体文件设置到response中
设置的同时会自动根据该文件添加对应的两个响应头:Content-Type与Content-Length

public void setEntity(File entity) {
		this.entity = entity;
		
		//根据请求资源的实际类型,设置Content-Type头
		String fileName=entity.getName();
		int index=fileName.lastIndexOf(".")+1;
		String ext=fileName.substring(index);
		String line=HttpContext.getMimeType(ext);  
		
		this.putHeader("Content-Type",line);
		this.putHeader("Content-Length",entity.length()+"");
		
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值