我为了锻炼目的写了一个非常简单的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以处理多个请求的类
答案 0 :(得分:2)
(我假设您在浏览器中使用完全相同的网址并使用curl
...)
如果浏览器在与服务不同的主机上运行,那么原因是localhost
IP地址(例如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数据包发送到错误的位置。 (我不知道这在技术上是否可行......)
第一颗子弹似乎对我很有用。
答案 1 :(得分:1)
出于安全原因,许多浏览器认为端口6666不安全。 请尝试其他端口,例如3000或5000(我只是在此处输入一个数字),它应该可以工作。
答案 2 :(得分:0)
浏览器仅了解http
和其他协议,例如ftp
。
您的serverSocket
未实现任何协议。
如果您想看些东西,也许可以在控制台中尝试
# telnet localhost 6666
编辑
这里是关于HTTP服务器正确实现的另一个问题(和答案): A Simple Http Server with Java/Socket?