![如何從外部區域網路存取Jetty伺服器?](https://rvso.com/image/770109/%E5%A6%82%E4%BD%95%E5%BE%9E%E5%A4%96%E9%83%A8%E5%8D%80%E5%9F%9F%E7%B6%B2%E8%B7%AF%E5%AD%98%E5%8F%96Jetty%E4%BC%BA%E6%9C%8D%E5%99%A8%EF%BC%9F.png)
我最初在 stackoveflow 上發布了這個問題,但被告知它更適合這個網站。
我正在嘗試從 LAN 外部的另一台電腦存取部署在一台電腦上的 Jetty 伺服器,但它不起作用。我讀了這個線程並遵循了提供的建議@喬金·埃爾德費爾特然而它不起作用。我的程式碼如下:
Server server = new Server();
// HTTP connector
ServerConnector serverConnector = new ServerConnector(server, 1, 1);
serverConnector.setHost("0.0.0.0"); <-
serverConnector.setPort(8080);
serverConnector.setIdleTimeout(30000);
// Set the connector
server.addConnector(serverConnector);
我嘗試使用以下程式碼從另一台遠端伺服器存取伺服器:
String postUrl = "http://" + myIP + ":8080"; // myIP is set to the public IP address of Jetty Server
System.out.println("Post URL: " + postUrl);
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(120 * 1000).build();
try (CloseableHttpClient httpClient = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).build();) {
HttpPost httpPostRequest = new HttpPost(postUrl);
...
但是,這會引發以下異常:
HttpPostConnectException: Connect to 123.4.56.78:8080.. failed: Connection refused: connect
是什麼導致了這個錯誤?我在出現提示時允許防火牆訪問,因此我認為這不是防火牆問題。該連接埠8080
也未用於任何其他進程。我嘗試了多個連接埠都沒有成功。
謝謝
答案1
我會將我的一些建議轉移到答案中。您缺少基本的網路知識,請嘗試閱讀一些相關知識(這裡例如)。一些基礎知識:
- 本地 IP(網路 192.168.xx、10.xxx 等)無法從網路訪問,只有直接連接到您的網路供應商(您的家庭路由器)的裝置才能從網路直接存取。
- 當您連接到家庭路由器並瀏覽網路時,會發生以下情況:由於無法從網路存取您的本機 IP,因此您的家庭路由器會隱藏您的本機 IP,並將其替換為您的公用 IP。執行此操作後,路由器會記錄連線以便能夠處理回覆。當回復到達時,相同的過程將相反:如果路由器在其表中找到傳入資料包的匹配連接,則公用 IP 將替換為您的私人 IP,並且回復將被轉送到網路內的正確裝置。這個過程稱為網路位址轉換(網路位址解讀)
- NAT 是對家庭網路內設備的保護(您的設備可以訪問互聯網,但互聯網無法訪問您的設備!) - 但如果您希望訪問家庭網絡中的設備,這也會變得困難來自網絡。這是因為您的路由器必須知道如何處理每個傳入的封包。預設值是:如果家庭網路內沒有設備打開該連接,則傳入的資料包將被丟棄!
現在應該很清楚了,為什麼你有多個 IP:Google 只能看到你的公開 IP。為了可以透過網路存取您的碼頭伺服器,您需要轉送連接埠。基本上,您將在家庭路由器內建立一條規則“將連接埠 8080 上收到的每個 TCP 封包轉送到內部設備 XY「。您需要檢查路由器手冊以了解如何執行此操作,大多數路由器都有用於配置的網路介面。我希望這能消除您的困惑...