3

我写了一个非常简单的 Java http 服务器来练习。我用 cURL 测试它,一切似乎都正常,但是当我尝试从浏览器发送请求时

http://localhost:6666/

服务器没有响应。我什至在服务器套接字接受连接时标记 System.out.println() ,当我尝试通过浏览器访问服务器时,该连接似乎没有触发。这个你能帮我吗。谢谢 :)

编辑:部分代码:

public class Server {

    private ServerSocket serverSocket;
    private Socket socket;
    public Server() {
        try {
            serverSocket = new ServerSocket(6666);
            while (true) {
                socket = serverSocket.accept();
                System.out.println("Whoop! Connection!");
                Request request = new Request(socket);
                request.run();
            }
        } catch (IOException e) {
            e.printStackTrace();
          }
    }
}

其中 Request 是一个扩展 Thread 以处理多个请求的类

4

3 回答 3

2

(我假设您在浏览器中使用完全相同的 URL 并使用curl...)

如果浏览器运行在与服务不同的主机上,那么原因是localhostIP 地址(例如127.0.0.1)没有路由到除了发送它们的主机之外的任何其他主机。(这就是“本地”的意思……)简而言之,这是正常行为。(也许您正在运行curl并且浏览器在不同的主机上。)

如果浏览器和服务运行在同一台主机上,这种行为有点令人费解。但是有一些可能的解释:

  • 您的浏览器中可能有一些奇怪的网络代理设置。例如,如果您将浏览器配置为将所有 http 请求(包括 127.0.0.1)发送到另一台机器上的 HTTP 代理,当代理将请求中继到真机时,它会发错地方。

  • localhost域名可能绑定了一些奇怪的IP地址;127.x.x.x例如IP地址以外的东西。(这是一件奇怪的事情,但我听说过被误导的人这样做。)

  • 127.0.0.1 IP 地址可能已绑定到环回网络适配器以外的其他东西。(我不知道这在技术上是否可行......)

  • 如果您使用 iptables 在虚拟网络上实现路由,您可能会将 127.0.0.1 数据包发送到错误的位置。(我不知道这在技术上是否可行......)

第一个子弹对我来说似乎最有可能。

于 2013-06-18T17:30:08.963 回答
1

出于安全原因,许多浏览器似乎认为端口 6666 是不安全的。请尝试其他一些端口,可能是端口 3000 或 5000(我只是在这里抛出一个数字)它应该可以工作。

于 2020-02-14T09:09:33.013 回答
0

浏览器只理解http和其他一些协议,例如ftp. 您serverSocket没有实现任何协议。如果你想看点什么,也许你可以在控制台试试

# telnet localhost 6666 

编辑

这里还有一个关于正确实现 HTTP 服务器的问题(和答案): A Simple Http Server with Java/Socket?

于 2020-02-14T13:22:24.170 回答