文章目錄
- 前言
- 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/
安裝好后我們打開cmd,輸入命令有正常出來版本號,表示安裝成功,一鍵安裝版,默認會配置環境變量。
node -v
2.創建node.js服務
這里我們在本地創建一個簡單的nodejs服務,創建一個貪吃蛇頁面小游戲來進行演示。
首先在本地創建一個文件夾,并在文件夾中新建2個文件,一個是js
文件和一個html
文件,需要放在同個目錄下,然后使用vscode打開。
game.html文件
nodetest.js文件
在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
有正常返回提示服務在本地3000端口下,我們打開瀏覽器,訪問http://127.0.0.1:3000/,出現貪吃蛇界面表示成功【游戲控制:鍵盤上下左右鍵】
4.內網穿透
這里我們使用cpolar來進行內網穿透,支持http/https/tcp協議,不限制流量,無需公網IP,也不用設置路由器,使用簡單。
4.1 安裝配置cpolar內網穿透
cpolar官網:https://www.cpolar.com/
訪問cpolar官網,注冊一個賬號,然后下載并安裝客戶端,具體安裝教程可以參考官網文檔教程。
- windows系統:在官網下載安裝包后,雙擊安裝包一路默認安裝即可。
- linux系統:支持一鍵自動安裝腳本,詳細請參考官網文檔——入門指南
4.2 創建隧道映射本地端口
cpolar安裝成功后,在瀏覽器上訪問本地9200端口http://localhost:9200,使用cpolar郵箱賬號登錄。
點擊左側儀表盤的隧道管理——創建隧道,創建一個指向本地3000端口的http隧道
- 隧道名稱:可自定義命名,注意不要與已有的隧道名稱重復
- 協議:選擇http
- 本地地址:3000
- 域名類型:免費選擇隨機域名
- 地區:選擇China vip
點擊創建
隧道創建成功后,點擊左側的狀態——在線隧道列表,查看所生成的公網地址,然后復制地址
打開瀏覽器器,我們使用上面公網地址進行訪問,至此,我們成功將本地·node.js
服務發布到了公網地址
5.固定公網地址
由于以上使用cpolar所創建的隧道使用的是隨機公網地址,24小時內會隨機變化,不利于長期遠程訪問。因此我們可以為其配置二級子域名,該地址為固定地址,不會隨機變化。
- 保留一個二級子域名
登錄cpolar官網,點擊左側的預留,選擇保留二級子域名,設置一個二級子域名名稱,點擊保留,保留成功后復制保留的二級子域名名稱
保留成功后復制保留的二級子域名地址
- 配置二級子域名
訪問http://127.0.0.1:9200/,登錄cpolar web UI管理界面,點擊左側儀表盤的隧道管理——隧道列表,找到所要配置的3000隧道,點擊右側的編輯
修改隧道信息,將保留成功的二級子域名配置到隧道中
- 域名類型:選擇二級子域名
- Sub Domain:填寫保留成功的二級子域名
點擊更新
更新完成后,打開在線隧道列表,此時可以看到公網地址已經發生變化,地址名稱也變成了保留過的二級子域名名稱,將其復制下來
然后使用固定http地址打開瀏覽器訪問
訪問成功,現在這個公網地址是固定的了,不會隨機變化。成功通過cpolar內網穿透,實現在外遠程訪問nodejs服務,無需公網IP ,也不用設置路由器。