مواد پر جائیں

ٹرمنل سے پورٹس فارورڈ کریں

گفتگو کے ٹرمنل میں آپ جو سرور شروع کرتے ہیں وہ صرف اسی اسپیس کے لیے شائع ہوتا ہے۔ پورٹس پینل اُس جگہ اس ایپ کے شروع کیے ہوئے لسنرز کو نوٹ کرتا ہے، ان کا نقشہ بناتا ہے، اور آپ کو ہر اُس جگہ کے لیے ایک پتہ دیتا ہے جہاں سے آپ ان تک پہنچنا چاہیں۔ دو اسپیسز دونوں 5173 پر سن سکتی ہیں؛ ان کے نقشے کبھی ملتے نہیں۔

یہاں کوئی چیز مشین کو کھولتی نہیں: ہر راستہ سرور طلب پر بناتا ہے اور وہ ٹرمنل یا رگ کے ساتھ ہی ختم ہو جاتا ہے۔

  1. گفتگو کا Terminal (VM) یا ہوسٹ شیل کھولیں (کسی اسپیس میں یا کسی PR صفحے پر)۔
  2. اپنا سرور شروع کریں — pnpm dev، python -m http.server 8000، کچھ بھی۔
  3. چند سیکنڈوں میں ٹرمنل کے اوپر دائیں کونے میں پلگ آئیکن پر ایک نکتہ آ جاتا ہے۔ اس پر کلک کریں۔

پینل ہر سننے والے پورٹ کو اُس کے مالک پروسیس کے ساتھ 3000 → 3000 کی صورت میں فہرست کرتا ہے: بائیں طرف وہ پورٹ جس پر پروسیس نے بائنڈ کیا، دائیں طرف وہ پورٹ جس پر وہ مقامی طور پر جواب دیتا ہے (جب بھی آپ کی مشین پر وہ خالی ہو تو وہی عدد)۔ ہر قطار یہ بھی بتاتی ہے کہ ڈیسک ٹاپ localhost، Browser (VM)، اور Android اس تک پہنچ سکتے ہیں یا نہیں۔

دریافت محدود رکھی جاتی ہے: Terminal (VM) کی پولنگ اُسی گیسٹ کے اندر ہوتی ہے؛ ہوسٹ شیل کی پولنگ اُس سیشن کے PTY پروسیس ٹری سے ہوتی ہے۔ دیگر اسپیسز، اور آپ کے Mac پر چلنے والے دیگر پروسیس، فہرست میں نہیں آتے۔

اس ٹرمنل میں نئے پورٹس خودکار طور پر فارورڈ ہوتے ہیں۔ اگر آپ صرف وہی چاہتے ہیں جو آپ خود شامل کریں تو اُسی پینل میں پورٹس خود فارورڈ کریں بند کر دیں۔

قطار پر مقامی URL کاپی کریں استعمال کریں — http://localhost:3000۔ یہ فارورڈ صرف لوپ بیک پر سنتا ہے، اس لیے آپ کے نیٹ ورک پر کوئی اور اسے نہیں دیکھ سکتا۔

اگر دو اسپیسز دونوں گیسٹ 5173 ظاہر کریں اور آپ کی مشین پر پہلے ہی 127.0.0.1:5173 موجود ہو، تو دوسری اسپیس گیسٹ 5173 رکھتی ہے اور ایک عارضی مقامی پورٹ لے لیتی ہے۔ کاپی URL دائیں طرف والا عدد استعمال کرتا ہے۔

ہوسٹ شیل پر پروسیس پہلے ہی آپ کی مشین پر ہوتا ہے۔ وہی مقامی پورٹ میپ کرنا بے اثر ہے؛ کوئی مختلف مقامی پورٹ چننے سے آپ کے چنے ہوئے پورٹ پر ایک لوپ بیک پراکسی بائنڈ ہو جاتی ہے۔

--host (یا 0.0.0.0 پر بائنڈ کرنا) بند Browser (VM) کو Mac پر کسی سرور تک پہنچنے کے قابل نہیں بناتا۔ گیسٹ کا اپنا لوپ بیک ہوتا ہے؛ جب Browser ٹیب اسی اسپیس میں ہو تو سرور اُس گیسٹ میں ایک ٹنل لگا دیتا ہے۔

بند براؤزر اسی گفتگو میں کھولیں۔ localhost:<left-hand port> ٹائپ کریں — وہی عدد جس پر پروسیس نے بائنڈ کیا۔ کوئی ری میپ (5173 → 3000) اُس براؤزر میں دائیں طرف والے عدد پر بھی جواب دیتا ہے، اس لیے کاپی URL وہاں بھی کام کرتا ہے۔ ایجنٹ کی browser_use دونوں میں سے کسی پر بھی جا سکتی ہے۔ اسپیس A میں موجود سرور اسپیس B کے براؤزر میں کبھی localhost:5173 کے طور پر ظاہر نہیں ہوتا۔

localhost استعمال کریں، نہ کوئی LAN IP اور نہ --host۔ گیسٹ کا اپنا لوپ بیک ہوتا ہے؛ ٹنل وہاں IPv4 اور IPv6 دونوں پر سنتا ہے۔

وہ صفحات جو بیک وقت بہت سی کنکشنز کھولتے ہیں (درجنوں اثاثے، ایک لائیو ری لوڈ ساکٹ) اُسی ٹنل کو شیئر کرتے ہیں۔ Browser (VM) انہیں ایک مستقل exec پر ملٹی پلیکس کرتا ہے، اس لیے فیچز کا جھکڑ فی کنکشن ایک پروسیس اسپان نہیں بنتا اور سفید صفحے کی صورت میں ٹائم آؤٹ نہیں ہوتا۔

ایک ہی اسپیس کے اندر، اسی عدد پر Terminal (VM) کا فارورڈ ہوسٹ شیل پر بھاری پڑتا ہے۔ اسپیسز کے درمیان کوئی ترجیح نہیں — وہ الگ الگ نقشے ہیں۔

اُس اسپیس کا Android ٹیب کھولیں۔ پھر ایمولیٹر کا localhost:<port> اِس اسپیس کے شائع شدہ پورٹ پر ریورس کر دیا جاتا ہے (adb reverse)۔ ایک ایمولیٹر آلے کے لحاظ سے عالمی ہوتا ہے: اسپیس B کو منسلک کرنے سے :5173 B کی طرف منتقل ہو جاتا ہے اور A والا ہٹ جاتا ہے۔ ٹیب بند کریں تو اِس رگ کے لگائے ہوئے تمام ریورس ہٹا دیے جاتے ہیں۔

iOS سمیولیٹر تو خود ہی Mac ہے — کوئی ریورس نہیں۔ ایک حقیقی iPhone کو پھر بھی LAN شیئر کی ضرورت ہوتی ہے۔

⋯ → مقامی نیٹ ورک پر شیئر کریں پورٹ کو <server-ip>:<random port> پر شائع کرتا ہے — یہ آپ کے فون پر صفحہ کھولنے کے لیے مفید ہے، یا جب سرور کسی دوسری مشین پر چل رہا ہو۔

  • LAN پورٹ ہمیشہ OS تفویض کردہ ہوتا ہے، کبھی گیسٹ کا عدد نہیں، اس لیے نمائش ایک سوچے سمجھے، نظر آنے والے پتے کی صورت میں ہوتی ہے، نہ کہ اندازہ لگانے والے کی۔
  • جب تک آپ اسے نہ بدلیں یہ نجی (صرف لوپ بیک) رہتا ہے، اور ⋯ → صرف مقامی اسے دوبارہ نیٹ ورک سے ہٹا دیتا ہے۔

⋯ → براؤزر ڈومین سیٹ کریں (.test) پورٹ کو ایک ڈیو ڈومین تفویض کرتا ہے، جیسے myapp.test۔ پھر Browser (VM) کے اندر https://myapp.test آپ کے سرور کو ایک درست تالے کے ساتھ لوڈ کرتا ہے — یہ ہر اُس چیز کے لیے مفید ہے جو کسی نامزد اوریجن یا محفوظ کانٹیکسٹ پر مختلف برتاؤ کرتی ہو (کوکیز، سروس ورکرز، OAuth کال بیکس)۔

  • ڈومینز کا اختتام .test یا .localhost پر ہونا ضروری ہے — ترقی کے لیے مخصوص یہ دو TLDs، اس لیے کوئی ڈیو نام کبھی کسی حقیقی سائٹ پر سایہ نہیں ڈال سکتا۔
  • سرور پر ڈومین نام منفرد ہوتے ہیں؛ پورٹ اعداد نہیں۔ دو اسپیسز دونوں 5173 استعمال کر سکتی ہیں، مگر دونوں myapp.test پر دعویٰ نہیں کر سکتیں۔
  • سرٹیفکیٹ ایک مقامی اتھارٹی سے آتا ہے جو پہلی ضرورت پر آپ کے سرور پر جاری کی جاتی ہے۔ اس کی کلیدیں سرور کی ڈیٹا ڈائریکٹری کے نیچے رہتی ہیں اور کبھی کسی گیسٹ میں داخل نہیں ہوتیں؛ بند براؤزر صرف اُسی ایک کلید پر بھروسا کرتا ہے، اس لیے حقیقی انٹرنیٹ کے ساتھ TLS پھر بھی معمول کے مطابق توثیق ہوتا ہے۔
  • یہ ڈومین صرف Browser (VM) کے اندر حل ہوتا ہے۔ میزبان پر آپ کا اپنا براؤزر اس کے بجائے localhost:<port> استعمال کرتا ہے۔
  • سادہ http://myapp.test بھی کام کرتا ہے۔

پینل کے نچلے حصے میں پورٹ شامل کریں کسی پورٹ کو اِس سے پہلے بھی میپ کر دیتا ہے کہ اُس پر کوئی سن رہا ہو (یا خواہ کوئی سن رہا ہو یا نہ ہو)۔ دستی فارورڈ آپ کے سرور کے دوبارہ شروع ہونے کے دوران بھی اپنا پتہ رکھتا ہے — جب تک سرور واپس نہ آئے قطار سن نہیں رہا دکھاتی ہے — جبکہ خودکار فارورڈ اپنے پورٹ کے ساتھ ہی غائب ہو جاتے ہیں۔ ہوسٹ شیل پر آپ کوئی مختلف مقامی پورٹ بھی سیٹ کر سکتے ہیں۔

پورٹس کی شناخت ورک اسپیس اور اسپیس سے ہوتی ہے۔ ہائپر وائزر کا اپنا پورٹ نقشہ مشین بوٹ ہونے پر مقرر ہو جاتا ہے، اس لیے Terminal (VM) دو تنگ چینلز پر سوار ہوتا ہے جو سرور کنٹرول کرتا ہے: ایک پیشگی بنایا گیا اِن باؤنڈ لین جو گیسٹ میں جاتا ہے اور ایسے کسی پورٹ سے جڑنے سے انکار کرتا ہے جس پر گیسٹ واقعی سن نہ رہا ہو، اور ریورس ٹنلز جو سرور Browser (VM) اور Android کے لیے کھلی رکھتا ہے۔ ہوسٹ شیل کبھی پوری مشین اسکین نہیں کرتا۔ کسی گیسٹ کے اندر ایسا کوئی لسنر کبھی نہیں بنایا جاتا جو سرور نے وہاں نہ رکھا ہو، اور سب کچھ ٹرمنل یا رگ کے ساتھ ہی ختم ہو جاتا ہے۔ یہ ڈیزائن رگز اور انکلوژرز میں بیان کیا گیا ہے؛ درست مخصوص پورٹس اور ڈومین قواعد رگز حوالہ میں ہیں۔