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()+"");
}