跳到內容

從終端機轉送連接埠

你在對話終端機中啟動的伺服器,只會發佈給該空間。連接埠面板會注意到本應用程式在該處啟動的監聽程式、將它們建立對應,並為你可能想連上的每個地方提供一個位址。兩個空間可以各自在 5173 上監聽;它們的對應永遠不會混在一起。

這裡沒有任何機制會把機器對外開放:每一條路徑都是由伺服器應要求建立,並隨著終端機或機台一起消滅。

  1. 開啟對話的終端機 (VM) 或主機 shell(在空間中或 PR 頁面上)。
  2. 啟動你的伺服器——pnpm dev、python -m http.server 8000,任何都可以。
  3. 幾秒內,終端機右上角的插頭圖示就會出現一個圓點。點擊它。

面板會列出每個正在監聽的連接埠及其所屬的處理程序,格式為 3000 → 3000:左邊是處理程序繫結的連接埠,右邊是它在本機回應的 連接埠(只要該號碼在你的機器上沒被占用,就會是同一個數字)。每一列 也會註明桌面的 localhost、瀏覽器 (VM) 與 Android 能否連上。

探索是受侷限的:終端機 (VM) 是在該客體內輪詢;主機 shell 則是從該工作階段的 PTY 處理程序樹輪詢。其他空間,以及你 Mac 上的其他處理程序,都不會被列出。

這個終端機中的新連接埠會自動轉送。如果你只想保留自己新增的連接埠,請在同一個面板中關閉自動轉送連接埠。

在該列上使用複製本機 URL——http://localhost:3000。轉送只會接聽回送位址,因此你網路上的其他東西都看不到它。

如果兩個空間都公開客體的 5173,而你的機器已經占用 127.0.0.1:5173,第二個空間會保留客體的 5173,並取得一個臨時的本機連接埠。複製 URL 會使用右邊的號碼。

在主機 shell 上,處理程序本來就在你的機器上。對應到相同的本機連接埠不會有任何作用;選擇不同的本機連接埠時,則會把一個回送代理繫結到你選的那一個。

--host(或繫結 0.0.0.0)不會讓封閉的瀏覽器 (VM) 能夠連上 Mac 上的伺服器。客體有自己的回送;當瀏覽器分頁位於同一個空間時,伺服器會打通一條隧道進入該客體。

在同一個對話中開啟封閉瀏覽器。輸入 localhost:<left-hand port>——也就是處理程序繫結的號碼。重新對應 (5173 → 3000)在該瀏覽器中同樣會以右邊的號碼回應,因此複製 URL 在那裡也能用。代理的 browser_use 可以導覽到其中任一者。 空間 A 的伺服器永遠不會以 localhost:5173 出現在空間 B 的瀏覽器中。

請使用 localhost,不要用區域網路 IP,也不要用 --host。客體有自己的回送;隧道會在那裡同時接聽 IPv4 與 IPv6。

一次開啟許多連線的頁面(數十個資源、一個即時重新載入的通訊端)會共用同一條隧道。瀏覽器 (VM) 會把它們多工到同一個常駐 exec 上,因此突然湧入的大量抓取不會變成每個連線生成一個處理程序,也不會逾時而變成一片空白頁面。

在同一個空間內,若號碼相同,終端機 (VM) 的轉送優先於主機 shell。跨空間則沒有優先順序——它們是各自獨立的對應。

開啟該空間的 Android 分頁。模擬器的 localhost:<port> 接著會反向對應到這個空間發佈的連接埠(adb reverse)。一台模擬器是裝置全域的:連接空間 B 會把 :5173 改指向 B,並丟掉 A 的。關閉分頁後,這台機台所建立的反向對應就會被移除。

iOS 模擬器本身就是 Mac——不需要反向對應。實體 iPhone 則仍需要區域網路分享。

⋯ → 在區域網路分享會在 <server-ip>:<random port> 發佈該連接埠——適合在手機上開啟頁面,或在伺服器執行於另一台機器時使用。

  • 區域網路連接埠一律由作業系統指派,永遠不會是客體的號碼,因此對外曝露的是一個刻意且可見的位址,而不是可被猜到的位址。
  • 在你切換之前,它會保持私密(僅限回送),而 ⋯ → 僅本機會將它從網路上收回。

**⋯ → 設定瀏覽器網域(.test)**會為該連接埠指派一個開發網域,例如 myapp.test。在瀏覽器 (VM) 內,https://myapp.test 便會以有效的鎖頭載入你的伺服器——對於任何在具名來源或安全情境下行為不同的東西(cookie、Service Worker、OAuth 回呼)都很有用。

  • 網域必須以 .test 或 .localhost 結尾——這是保留給開發用的兩個頂級網域,因此開發名稱永遠無法遮蔽真實網站。
  • 網域名稱在伺服器上是唯一的;連接埠號碼則不是。兩個空間可以都使用 5173,但不能都佔用 myapp.test。
  • 憑證來自你的伺服器在第一次需要時所簽發的本機憑證授權單位。其金鑰存放在伺服器的資料目錄下,永遠不會進入任何客體;封閉瀏覽器只信任這一把金鑰,因此連往真實網際網路的 TLS 仍會正常驗證。
  • 該網域只在瀏覽器 (VM) 內解析。你自己在主機上的瀏覽器則改用 localhost:<port>。
  • 單純的 http://myapp.test 也可以運作。

面板底部的新增連接埠可在任何東西開始監聽之前(或不論是否有東西在監聽)就先把連接埠對應好。手動轉送會在伺服器重新啟動期間保留其位址——該列會顯示未在監聽,直到伺服器回來——而自動轉送則會在連接埠消失時一併消失。在主機 shell 上,你也可以設定不同的本機連接埠。

連接埠以工作區與空間為索引鍵。Hypervisor 自己的連接埠對應在機器開機時就固定了,因此終端機 (VM) 只能走兩條由伺服器控制的狹窄通道:一條預先建立、通往客體的入站通道,它會拒絕連線到客體實際上並未監聽的任何連接埠;以及伺服器為瀏覽器 (VM) 與 Android 保持開啟的反向隧道。主機 shell 永遠不會掃描整台機器。客體內永遠不會建立伺服器沒有放進去的監聽程式,而一切也會隨著終端機或機台一起拆除。這套設計說明於 機台與隔離艙; 確切的保留連接埠與網域規則請見 機台參考。