Tamacti_Jun 2024-10-17 23:03 采纳率: 81.5%
浏览 63
已结题

为什么localhost8080访问失败


package com.itheima;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

/*
 * 自定义web服务器
 */
public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(8080); // 监听指定端口
        System.out.println("server is running...");

        while (true){
            Socket sock = ss.accept();
            System.out.println("connected from " + sock.getRemoteSocketAddress());

            //开启线程处理请求
            Thread t = new Handler(sock);
            t.start();
        }
    }
}

class Handler extends Thread {
    Socket sock;

    public Handler(Socket sock) {
        this.sock = sock;
    }

    public void run() {
        try (InputStream input = this.sock.getInputStream(); OutputStream output = this.sock.getOutputStream()) {
                handle(input, output);
        } catch (Exception e) {
            try {
                this.sock.close();
            } catch (IOException ioe) {
            }
            System.out.println("client disconnected.");
        }
    }

    private void handle(InputStream input, OutputStream output) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));

        // 读取HTTP请求:
        boolean requestOk = false;
        String first = reader.readLine();
        if (first.startsWith("GET / HTTP/1.")) {
            requestOk = true;
        }

        for (;;) {
            String header = reader.readLine();
            if (header.isEmpty()) { // 读取到空行时, HTTP Header读取完毕
                break;
            }
            System.out.println(header);
        }
        System.out.println(requestOk ? "Response OK" : "Response Error");

        if (!requestOk) {// 发送错误响应:
            writer.write("HTTP/1.0 404 Not Found\r\n");
            writer.write("Content-Length: 0\r\n");
            writer.write("\r\n");
            writer.flush();
        } else {  // 发送成功响应:
            //读取html文件,转换为字符串
            InputStream is = Server.class.getClassLoader().getResourceAsStream("html/a.html");
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            StringBuilder data = new StringBuilder();
            String line = null;
            while ((line = br.readLine()) != null){
                data.append(line);
            }
            br.close();
            int length = data.toString().getBytes(StandardCharsets.UTF_8).length;

            writer.write("HTTP/1.1 200 OK\r\n");
            writer.write("Connection: keep-alive\r\n");
            writer.write("Content-Type: text/html\r\n");
            writer.write("Content-Length: " + length + "\r\n");
            writer.write("\r\n"); // 空行标识Header和Body的分隔
            writer.write(data.toString());
            writer.flush();
        }
    }
}

为什么localhost:8080访问失败

  • 写回答

1条回答 默认 最新

  • 无疆76 2024-10-17 23:04
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    你的代码是一个简单的自定义web服务器,根据你所提供的代码和描述,以下是一些可能导致localhost:8080访问失败的原因及其解决方案:

    1. 端口被占用: 有可能其他的程序或服务已经占用了端口8080。你可以使用命令行工具(如Windows上的netstat -ano或Linux上的lsof -i :8080)来检查端口是否被占用。如果被占用,你可以更改你的服务器代码中的端口号或者关闭占用该端口的程序。
    2. 防火墙设置: 你的防火墙可能阻止了来自localhost:8080的连接。确保你的防火墙设置允许该端口的连接。
    3. 代码中的错误: 你的代码在处理HTTP请求时有一些基本的逻辑,可能存在问题。例如,你只在接收到“GET / HTTP/1.”这样的请求时认为请求是有效的。这意味着如果你的客户端发送其他类型的请求或不同的协议版本,服务器可能会认为请求无效并返回错误响应。此外,你的服务器在处理HTTP头部时没有完全遵循HTTP协议规范,可能会导致某些浏览器或客户端无法正确解析响应。
    4. 资源文件路径问题: 在尝试读取HTML文件时,你使用了Server.class.getClassLoader().getResourceAsStream("html/a.html")。确保你的资源文件路径是正确的,并且文件确实存在于预期的路径上。如果资源文件不在类路径下,这种方法可能无法找到文件。
    5. 服务器未启动或启动失败: 确保你的服务器代码没有运行时错误,并且已经成功启动。你可以通过检查控制台输出或添加更多的日志输出来诊断问题。
    6. 浏览器缓存和跨域问题: 有时浏览器缓存或跨域策略可能导致看似奇怪的访问问题。尝试清除浏览器缓存或使用不同的浏览器进行测试。

    为了更准确地诊断问题,你可以查看服务器的控制台输出以获取任何可能的错误消息或异常。此外,使用网络调试工具(如浏览器的开发者工具中的网络选项卡)来查看请求和响应的详细信息也可能有所帮助。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月1日
  • 已采纳回答 10月24日
  • 创建了问题 10月17日