无法从服务器获得响应,前端无法接受到服务器响应

博主在遵循《深入剖析Tomcat》第一节教程编写了一个简易的Web服务器,遇到一个问题:当请求存在文件的index.html时,服务器无法响应;而请求不存在的文件时,服务器能正确返回404错误。问题可能出在文件读取或响应处理环节。代码中定义了静态资源路径,读取输入流,解析HTTP请求,创建响应,并尝试发送静态资源。对于找不到的文件,服务器返回HTTP 404错误信息。
摘要由CSDN通过智能技术生成

我按照《深入剖析Tomcat》的第一节写了一个简单的web服务器

但是为什么无法接受到服务器响应

源代码如下:

public class HttpServer {

/**

* WEB_ROOT:静态资源存放目录

* System.getProperty -> F:\Practice\tomcat_practice 获取当前工程路径

* File.separator -> \ 获取当前系统的路径分隔符

*/

public static final String WEB_ROOT = System.getProperty("user.dir") + File.separator + "webroot";

private static final String SHUTDOWN_COMMAND = "/SHUTDOWM";

private boolean shutdown = false;

public static void main(String[] args) {

HttpServer httpServer = new HttpServer();

httpServer.await();

}

private void await() {

ServerSocket serverSocket = null;

int port = 8080;

try{

// 第二个参数:请求传入连接队列的最大长度

serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));

}catch (IOException e){

e.printStackTrace();

// 非零状态码表示异常终止

System.exit(1);

}

// 循环等待请求

while (!shutdown){

Socket socket=null;

InputStream input = null;

OutputStream output = null;

try {

socket = serverSocket.accept();

// 创建请求对象并解析

input = socket.getInputStream();

Request request = new Request(input);

request.parse();

// 创建响应对象

output = socket.getOutputStream();

Response response = new Response(output);

response.setRequest(request);

response.sendStaticResource();

// 关闭 socket

socket.close();

// 测试 HTTP 请求的 URI 是否是关闭命令

shutdown = request.getUri().equals(SHUTDOWN_COMMAND);

} catch (IOException e) {

e.printStackTrace();

continue;

}

}

}

}

/**

* 这个类代表一个 HTTP 请求

* 包含解析的相关方法

*/

public class Request {

private InputStream input;

private String uri;

public Request(InputStream input) {

this.input = input;

}

// 解析 HTTP 中的原始数据

public void parse() {

StringBuffer request = new StringBuffer(2048);

int i;

// 读取数据的缓冲区

byte[] buffer = new byte[2048];

try {

i = input.read(buffer);

} catch (IOException e) {

e.printStackTrace();

i = -1;

}

for (int j = 0; j < i; j++) {

request.append((char) buffer[j]);

}

System.out.println(request.toString());

uri = parseUri(request.toString());

}

/**

* 解析 HTTP 中的 URI

* GET /index.html HTTP/1.1 -> /index.html

*/

private String parseUri(String requestString) {

int index1, index2;

// 返回第一次出现 ' ' 位置的索引

index1 = requestString.indexOf(' ');

if (index1 != -1) {

// 返回从 index1+1 位置后,第一次出现 ' ' 的索引

index2 = requestString.indexOf(' ', index1 + 1);

if (index2 > index1) {

return requestString.substring(index1 + 1, index2);

}

}

return null;

}

public String getUri() {

return uri;

}

}

/**

* 这个类代表一个 HTTP 响应

* */

public class Response {

public static final int BUFFER_SIZE = 1024;

Request request;

OutputStream output;

public Response(OutputStream output) {

this.output = output;

}

public void setRequest(Request request) {

this.request = request;

}

/**

* 发送一个静态资源到浏览器

* */

public void sendStaticResource() throws IOException {

byte[] bytes = new byte[BUFFER_SIZE];

FileInputStream fis = null;

try {

// 文件存在就写入 output

File file = new File(HttpServer.WEB_ROOT, request.getUri());

if(file.exists()){

fis = new FileInputStream(file);

int ch = fis.read(bytes, 0, BUFFER_SIZE);

while (ch!=-1){

output.write(bytes,0,ch);

ch = fis.read(bytes,0,BUFFER_SIZE);

}

}else {

// 没有找到文件

String errorMessage = "HTTP/1.1 404 File Not Found\r\n"+

"Content-type: text/html\r\n"+

"Content-length: 23\r\n"+"" +

"\r\n"+

"

File Not Found

";

output.write(errorMessage.getBytes());

}

} catch (Exception e) {

System.out.println(e.toString());

}finally {

if(fis!=null){

fis.close();

}

}

}

}

当我访问一个 存在的 index.html,无法收到响应

aeb30e184b33f095016ec1b1a187b0f1.png

但是我访问一个不存在文件 ,却能正确收到响应,我不知道是哪里出了问题

e5143c7a853357e1f7fcf9667740b7a7.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值