JavaSE02_Day04(中)-WebServer项目(五、六:重构项目、显示图片)
1.1 版本五:重构项目
将ClientHandler类中响应客户端的操作进行重构,设计一个类HttpResponse类,用它的每一个实例表示服务端发送给客户端的一个具体的响应内容:
-
在http包下添加类:HttpResponse.java
-
在HttpResponse类中定义方法flush,用来将当前响应发送给客户端。flush方法需要处理的三件事情:
2.1 发送状态行
2.2 发送响应头
2.3 发送响应正文
-
将ClientHandler类中响应客户端的操作移动到HttpResponse类中的对应方法中.
-
在ClientHandler类中实例化HttpResponse,并设置要响应的内容后调用flush方法响应客户端
新建HttpResponse.java响应客户端请求类
package cn.tedu.http;
/**
* 向客户端进行响应
* @author cjn
*
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
public class HttpResponse {
/**
* 有关于状态行相关信息定义
*/
private int statusCode = 200;
private String statusReason = "OK";
/**
* 有关于响应头相关信息定义
*/
/**
* 有关于响应正文相关信息定义
*/
private File entity;
/**
* 相关连接信息定义
*/
private Socket socket;
private OutputStream out;
/**
* 构造器方法,完成相关连接信息属性的赋值
*/
public HttpResponse(Socket socket) {
try {
this.socket = socket;
this.out = socket.getOutputStream();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 调用发送响应信息的三个方法,完成响应客户端信息的操作
*/
public void flush() {
/*
* 响应客户端
* 1.发送状态行
* 2.发送响应头
* 3.发送响应正文
*/
sendStatusLine();
sendHeader();
sendContext();
}
/**
* 发送状态行
*/
public void sendStatusLine() {
try {
String line = "HTTP/1.1 "+statusCode+" "+statusReason;
out.write(line.getBytes("ISO8859-1"));
out.write(13);//CR
out.write(10);//LF
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 发送响应头
*/
public