利用Node.js和cpolar實現遠程訪問,無需公網IP和路由器設置的完美解決方案

文章目錄

  • 前言
  • 1.安裝Node.js環境
  • 2.創建node.js服務
  • 3. 訪問node.js 服務
  • 4.內網穿透
    • 4.1 安裝配置cpolar內網穿透
    • 4.2 創建隧道映射本地端口
  • 5.固定公網地址

前言

Node.js 是能夠在服務器端運行 JavaScript 的開放源代碼、跨平臺運行環境。Node.js 由 OpenJS Foundation(原為 Node.js Foundation,已與 JS Foundation 合并)持有和維護,亦為 Linux 基金會的項目。Node.js 采用 Google 開發的 V8 運行代碼,使用事件驅動、非阻塞和異步輸入輸出模型等技術來提高性能,可優化應用程序的傳輸量和規模。這些技術通常用于資料密集的即時應用程序。

Node.js 大部分基本模塊都用 JavaScript 語言編寫。在 Node.js 出現之前,JavaScript 通常作為客戶端程序設計語言使用,以JavaScript 寫出的程序常在用戶的瀏覽器上運行。Node.js 的出現使 JavaScript 也能用于服務端編程。Node.js 含有一系列內置模塊,使得程序可以脫離 Apache HTTP Server 或 IIS,作為獨立服務器運,下面將介紹如何簡單幾步實現遠程公共網絡下訪問windwos node.js的服務端。

1.安裝Node.js環境

官網下載node.js,我們選擇64位一鍵安裝

https://nodejs.org/zh-cn/download/

image-20230302141011787

安裝好后我們打開cmd,輸入命令有正常出來版本號,表示安裝成功,一鍵安裝版,默認會配置環境變量。

node -v

image-20230302150424377

2.創建node.js服務

這里我們在本地創建一個簡單的nodejs服務,創建一個貪吃蛇頁面小游戲來進行演示。

首先在本地創建一個文件夾,并在文件夾中新建2個文件,一個是js文件和一個html文件,需要放在同個目錄下,然后使用vscode打開。

  • game.html文件
  • nodetest.js文件

image-20230302155043387

game.html添加如下html代碼并保存,以下代碼是一個html頁面小游戲(貪吃蛇)

<!DOCTYPE html>
<html>
<head><title>貪吃蛇</title><meta charset="UTF-8"><meta name="keywords" content="貪吃蛇"><meta name="Description" content="這是一個初學者用來學習的小游戲"><style type="text/css">*{margin:0;}.map{margin:100px auto;height:600px;width:900px;background:#00D0FF;border:10px solid #AFAEB2;border-radius:8px;}</style>
</head><body>
<div class="map">
<canvas id="canvas" height="600" width="900"></canvas>
</div><script type="text/javascript">//獲取繪制工具/*var canvas = document.getElementById("canvas");var ctx = canvas.getContext("2d");//獲取上下文ctx.moveTo(0,0);ctx.lineTo(450,450);*/var c=document.getElementById("canvas");var ctx=c.getContext("2d");/*ctx.beginPath();ctx.moveTo(0,0);ctx.lineTo(450,450);ctx.stroke();*/var snake =[];//定義一條蛇,畫蛇的身體var snakeCount = 6;//初始化蛇的長度var foodx =0;var foody =0;var togo =0;function drawtable()//畫地圖的函數{for(var i=0;i<60;i++)//畫豎線{ctx.strokeStyle="black";ctx.beginPath();ctx.moveTo(15*i,0);ctx.lineTo(15*i,600);ctx.closePath();ctx.stroke();}for(var j=0;j<40;j++)//畫橫線{ctx.strokeStyle="black";ctx.beginPath();ctx.moveTo(0,15*j);ctx.lineTo(900,15*j);ctx.closePath();ctx.stroke();}for(var k=0;k<snakeCount;k++)//畫蛇的身體{ctx.fillStyle="#000";if (k==snakeCount-1){ctx.fillStyle="red";//蛇頭的顏色與身體區分開}ctx.fillRect(snake[k].x,snake[k].y,15,15);//前兩個數是矩形的起始坐標,后兩個數是矩形的長寬。}//繪制食物	ctx.fillStyle ="black";ctx.fillRect(foodx,foody,15,15);ctx.fill();}function start()//定義蛇的坐標{//var snake =[];//定義一條蛇,畫蛇的身體//var snakeCount = 6;//初始化蛇的長度for(var k=0;k<snakeCount;k++){snake[k]={x:k*15,y:0};}drawtable();addfood();//在start中調用添加食物函數}function addfood(){foodx = Math.floor(Math.random()*60)*15; //隨機產生一個0-1之間的數foody = Math.floor(Math.random()*40)*15;for (var k=0;k<snake;k++){if (foodx==snake[k].x&&foody==sanke[k].y)//防止產生的隨機食物落在蛇身上{	addfood();}}}	function move(){switch (togo){case 1: snake.push({x:snake[snakeCount-1].x-15,y:snake[snakeCount-1].y}); break;//向左走case 2: snake.push({x:snake[snakeCount-1].x,y:snake[snakeCount-1].y-15}); break;case 3: snake.push({x:snake[snakeCount-1].x+15,y:snake[snakeCount-1].y}); break;case 4: snake.push({x:snake[snakeCount-1].x,y:snake[snakeCount-1].y+15}); break;case 5: snake.push({x:snake[snakeCount-1].x-15,y:snake[snakeCount-1].y-15}); break;case 6: snake.push({x:snake[snakeCount-1].x+15,y:snake[snakeCount-1].y+15}); break;default: snake.push({x:snake[snakeCount-1].x+15,y:snake[snakeCount-1].y});}snake.shift();//刪除數組第一個元素ctx.clearRect(0,0,900,600);//清除畫布重新繪制isEat();isDead();drawtable();} 			function keydown(e){switch(e.keyCode){case 37: togo=1; break;case 38: togo=2; break;case 39: togo=3; break;case 40: togo=4; break;case 65: togo=5; break;case 68: togo=6; break;}}function isEat()//吃到食物后長度加1{if(snake[snakeCount-1].x==foodx&&snake[snakeCount-1].y==foody){addfood();snakeCount++;snake.unshift({x:-15,y:-15});}}//死亡函數function isDead(){if (snake[snakeCount-1].x>885||snake[snakeCount-1].y>585||snake[snakeCount-1].x<0||snake[snakeCount-1].y<0){window.location.reload();}}document.onkeydown=function(e)
{keydown(e);} 
window.onload = function()//調用函數
{ start();setInterval(move,150);drawtable();}
</script>
</body>
</html>

nodetest.js文件添加如下js代碼,以下代碼意思是開啟一個http服務,設置監聽3000端口號

const http = require('http');//加載文件模塊
const fs = require("fs");const hostname = '127.0.0.1';
//端口
const port = 3000;const server = http.createServer((req, res) => {res.statusCode = 200;res.setHeader('Content-Type', 'text/html');fs.readFile('./game.html', (err, data) => {if (err) throw err;console.log(data.toString);res.end(data);});});server.listen(port, hostname, () => {console.log(`Server running at http://${hostname}:${port}/`);
});

3. 訪問node.js 服務

當我們編寫好相關代碼后,我們開始啟動服務.在vscode控制臺輸入命令【注意需要進入到相應的文件目錄下執行命令】

node .\nodetest.js

image-20230302170633966

有正常返回提示服務在本地3000端口下,我們打開瀏覽器,訪問http://127.0.0.1:3000/,出現貪吃蛇界面表示成功【游戲控制:鍵盤上下左右鍵】

image-20230302171105342

4.內網穿透

這里我們使用cpolar來進行內網穿透,支持http/https/tcp協議,不限制流量,無需公網IP,也不用設置路由器,使用簡單。

4.1 安裝配置cpolar內網穿透

cpolar官網:https://www.cpolar.com/

訪問cpolar官網,注冊一個賬號,然后下載并安裝客戶端,具體安裝教程可以參考官網文檔教程。

  • windows系統:在官網下載安裝包后,雙擊安裝包一路默認安裝即可。
  • linux系統:支持一鍵自動安裝腳本,詳細請參考官網文檔——入門指南

20230130105715

4.2 創建隧道映射本地端口

cpolar安裝成功后,在瀏覽器上訪問本地9200端口http://localhost:9200,使用cpolar郵箱賬號登錄。

20230130105810

點擊左側儀表盤的隧道管理——創建隧道,創建一個指向本地3000端口的http隧道

  • 隧道名稱:可自定義命名,注意不要與已有的隧道名稱重復
  • 協議:選擇http
  • 本地地址:3000
  • 域名類型:免費選擇隨機域名
  • 地區:選擇China vip

點擊創建

image-20230302171633772

隧道創建成功后,點擊左側的狀態——在線隧道列表,查看所生成的公網地址,然后復制地址

image-20230302171740715

打開瀏覽器器,我們使用上面公網地址進行訪問,至此,我們成功將本地·node.js 服務發布到了公網地址

image-20230302171817498

5.固定公網地址

由于以上使用cpolar所創建的隧道使用的是隨機公網地址,24小時內會隨機變化,不利于長期遠程訪問。因此我們可以為其配置二級子域名,該地址為固定地址,不會隨機變化。

  • 保留一個二級子域名

登錄cpolar官網,點擊左側的預留,選擇保留二級子域名,設置一個二級子域名名稱,點擊保留,保留成功后復制保留的二級子域名名稱

image-20230302172317079

保留成功后復制保留的二級子域名地址

image-20230302172454064

  • 配置二級子域名

訪問http://127.0.0.1:9200/,登錄cpolar web UI管理界面,點擊左側儀表盤的隧道管理——隧道列表,找到所要配置的3000隧道,點擊右側的編輯

image-20230302172856768

修改隧道信息,將保留成功的二級子域名配置到隧道中

  • 域名類型:選擇二級子域名
  • Sub Domain:填寫保留成功的二級子域名

點擊更新

image-20230302172806823

更新完成后,打開在線隧道列表,此時可以看到公網地址已經發生變化,地址名稱也變成了保留過的二級子域名名稱,將其復制下來

image-20230302172935943

然后使用固定http地址打開瀏覽器訪問

image-20230302173012863
訪問成功,現在這個公網地址是固定的了,不會隨機變化。成功通過cpolar內網穿透,實現在外遠程訪問nodejs服務,無需公網IP ,也不用設置路由器。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211415.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211415.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211415.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ESP32網絡編程-OTA方式升級固件(基于Web瀏覽器)

OTA方式升級固件(基于Web瀏覽器) 文章目錄 OTA方式升級固件(基于Web瀏覽器)1、ESP32的OTA介紹2、OTA升級固件方式3、軟件準備4、硬件準備5、代碼實現6、一種優雅方式實現Web方式OTA升級6.1 基礎OTA代碼6.2 新固件庫代碼在前面的文章中,我們在Arduino IDE的網絡端口中,實現…

LeetCode 77.組合

題目&#xff1a; 給定兩個整數 n 和 k&#xff0c;返回范圍 [1, n] 中所有可能的 k 個數的組合。 你可以按 任何順序 返回答案。 方法&#xff1a;靈神-組合型回溯 剪枝 class Solution {private int k;private final List<Integer> path new ArrayList<>();…

反序列化 [網鼎杯 2020 朱雀組]phpweb 1

打開題目 我們發現這個頁面一直在不斷的刷新 我們bp抓包一下看看 我們發現index.php用post方式傳了兩個參數上去&#xff0c;func和p 我們需要猜測func和p兩個參數之間的關系&#xff0c;可以用php函數MD5測一下看看 我們在響應處得到了一串密文&#xff0c;md5解密一下看看 發…

Windows11安裝使用Oracle21C詳細步驟<圖文保姆級>新版本

Windows11安裝使用Oracle21C詳細步驟<圖文保姆級>新版本 Database Software Downloads | Oracle 中國 下載完成后解壓縮 雙擊setup.exe 打開安裝頁面 同意下一步 更改自己的路徑點擊下一步 輸入密碼 下一步安裝等待即可 等待加載配置時間有點久 完成即可 使用 搜索…

【Kubernetes】四層代理Service

Service四層代理 一、Service概念原理1.1、為什么要有Service1.2、Service概述1.3、工作原理1.4、三類IP地址【1】Node Network&#xff08;節點網絡&#xff09;【2】Pod network&#xff08;pod 網絡&#xff09;【3】Cluster Network&#xff08;服務網絡&#xff09; 二、S…

C++之異常處理

C語言傳統的處理錯誤的方式 傳統的錯誤處理機制&#xff1a; 1. 終止程序, 如assert. 缺陷: 用戶難以接受, 如發生內存錯誤, 除0錯誤時就會終止程序. 如果assert括號里面的表達式結果為假, 那么assert就會中斷程序并報錯, 所以使用assert可以幫助我們在程序判斷一些可能出錯的…

翻轉二叉樹(圖解、前序遍歷、遞歸與非遞歸)

LCR 144. 翻轉二叉樹 - 力扣&#xff08;LeetCode&#xff09; 給定一棵二叉樹的根節點 root&#xff0c;請左右翻轉這棵二叉樹&#xff0c;并返回其根節點。 示例 1&#xff1a; 輸入&#xff1a;root [5,7,9,8,3,2,4] 輸出&#xff1a;[5,9,7,4,2,3,8] 提示&#xff1a; …

【11】Qt Designer

目錄 VSCode添加外部工具 QtDesigner PyUIC PyRCC 加載UI文件模板代碼 QMainWindow QWidget 常用知識點 1. 修改標題圖標 2. 圖片資源管理 3. 圖片按鈕 4. 加載對話框 5. 動態加載Widget 6. 修改主題 其他注意事項 事件被多次觸發 PyQt5提供了一個可視化圖形工…

【小沐學Python】Python實現WebUI網頁圖表(gradio)

文章目錄 1、簡介2、安裝3、基本測試3.1 入門代碼3.2 組件屬性3.3 多個輸入和輸出組件3.4 圖像示例3.5 聊天機器人3.6 模塊&#xff1a;更靈活、更可控3.7 進度條 結語 1、簡介 https://www.gradio.app/ Gradio是用友好的網絡界面演示機器學習模型的最快方法&#xff0c;因此…

【T+】暢捷通T+軟件安裝過程中停留在:正在配置產品位置或進度80%位置。

【問題描述】 暢捷通T軟件在安裝過程中&#xff0c; 進度條一直停留在【正在配置產品…】位置。 【解決方法】 打開【任務管理器】&#xff0c;想必這個如何打開&#xff0c;大家應該都會。 在【進程】中找到【DBConfig.exe】或者【Ufida.T.Tool.SM.DBConfig.exe】進程并結束…

TS條件類型、斷言及名義類型

文章將討論處理類型的幾個高級模式&#xff0c;包括模擬名義類型的類型烙印、利用條件類型的分配性質在類型層面操作類型&#xff0c;以及安全地擴展原型。 1 函數類型 TS在推導元組的類型時會放寬要求&#xff0c;推導出的結果盡量寬泛&#xff0c;不在乎元組的長度和各位置…

Spring Cloud Gateway使用和配置

Spring Cloud Gateway是Spring官方基于Spring 5.0&#xff0c;Spring Boot 2.0和Project Reactor等技術開發的網關&#xff0c;Spring Cloud Gateway旨在為微服務架構提供一種簡單而有效的統一的API路由管理方式。Spring Cloud Gateway作為Spring Cloud生態系中的網關&#xff…

Linux 基礎IO

文章目錄 前言基礎IO定義系統IO接口文件描述符重定向原理緩沖區刷新 前言 要知道每個函數/接口的全部參數和返回值建議去官網或者直接在Linux的man手冊中查&#xff0c;這不是復制粘貼函數用法的文章。 C語言文件讀寫介紹鏈接 基礎IO定義 IO是Input/Output的縮寫&#xff0c…

optional

參考資料&#xff1a; Java8 Optional用法和最佳實踐 - 掘金 一、背景 根據Oracle文檔&#xff0c;Optional是一個容器對象&#xff0c;可以包含也可以不包含非null值。Optional在Java 8中引入&#xff0c;目的是解決 NullPointerExceptions的問題。本質上&#xff0c;Optio…

2024年網絡安全競賽-網站滲透

網站滲透 (一)拓撲圖 1.使用滲透機對服務器信息收集,并將服務器中網站服務端口號作為flag提交; 使用nmap工具對靶機進行信息收集 2.使用滲透機對服務器信息收集,將網站的名稱作為flag提交; 訪問頁面即可 3.使用滲透機對服務器滲透,將可滲透頁面的名稱作為flag提交…

Python:核心知識點整理大全5-筆記

目錄 2. 使用方法pop()刪除元素 3. 彈出列表中任何位置處的元素 4. 根據值刪除元素 3 章 列表簡介 3.3 組織列表 3.3.1 使用方法 sort()對列表進行永久性排序 3.3.2 使用函數 sorted()對列表進行臨時排序 3.3.3 倒著打印列表 3.3.4 確定列表的長度 3.5 小結 2. 使用方…

軟件測試:測試用例八大要素模板

一、通用測試用例八要素 1、用例編號&#xff1b; 2、測試項目&#xff1b; 3、測試標題&#xff1b; 4、重要級別&#xff1b; 5、預置條件&#xff1b; 6、測試輸入&#xff1b; 7、操作步驟&#xff1b; 8、預期輸出 二、具體分析通用測試用例八要素 1、用例編號 一般是數字…

[NAND Flash 2.1] NAND Flash 閃存改變了現代生活

依公知及經驗整理&#xff0c;原創保護&#xff0c;禁止轉載。 專欄 《深入理解NAND Flash》 <<<< 返回總目錄 <<<< ? 1989年NAND閃存面世了&#xff0c;它曾經且正在改變了我們的日常生活。 NAND 閃存發明之所以偉大&#xff0c;是因為&#xff0c…

一個CV算法工程師在技術方面的小反思

極市導讀 正如作者所說,做一個算法工程師最重要的素質是在海量的算法方案中理解,吃透那些真正的干貨,然后不斷在實踐中去驗證,并總結吸收到自己的腦子里。本文記錄了作者在算法工程師這個崗位上一年后總結的一些關于技術上的經驗總結。>>加入極市CV技術交流群,走在計…

怎樣解決編譯后的exe文件運行時產生的錯誤?

編譯后的exe文件運行時&#xff0c;錯誤如下錯誤提示&#xff1a;Traceback (most recent call last):File "pd.py", line 1, in <module>from pdf2docx import parse ModuleNotFoundError: No module named pdf2docx 怎樣解決&#xff1f; 這個錯誤提示表明…