[英]Why can't I connect to http server on localhost through a browser?
我寫了一個非常簡單的 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 以處理多個請求的類
(我假設您在瀏覽器中使用完全相同的 URL 並使用curl
...)
如果瀏覽器在與服務不同的主機上運行,則原因是localhost
IP 地址(例如127.0.0.1
)不會路由到除發送它們的主機之外的任何其他主機。 (這就是“本地”的意思......)簡而言之,這是正常的行為。 (也許您正在不同的主機上運行curl
和瀏覽器。)
如果瀏覽器與服務運行在同一台主機上,這種行為有點令人費解。 然而,有一些可能的解釋:
您的瀏覽器中可能有一些奇怪的網絡代理設置。 例如,如果您將瀏覽器配置為將所有 http 請求(包括 127.0.0.1)發送到另一台機器上的 HTTP 代理,則當代理將請求中繼到真機時,它會轉到錯誤的地方。
localhost
域名可能綁定了一些奇怪的IP地址; 例如,不是127.xxx
IP 地址的東西。 (這是一件很奇怪的事情,但我聽說過一些被誤導的人這樣做。)
127.0.0.1 IP 地址可能已綁定到環回網絡適配器以外的其他內容。 (我不知道這在技術上是否可行......)
如果您使用 iptables 在虛擬網絡上實現路由,您可能會將 127.0.0.1 數據包發送到錯誤的地方。 (我不知道這在技術上是否可行......)
第一顆子彈在我看來最有可能。
出於安全原因,許多瀏覽器認為端口 6666 是不安全的。 請嘗試一些其他端口可能是端口 3000 或 5000(我只是在這里拋出一個數字)它應該可以工作。
瀏覽器只理解http
和其他一些協議,比如ftp
。 您的serverSocket
沒有實現任何協議。 如果你想看一些東西,也許你可以在控制台中嘗試
# telnet localhost 6666
編輯
這是正確實現 HTTP 服務器的另一個問題(和答案): A Simple Http Server with Java/Socket?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.