使用Node.js創(chuàng)建HTTP服務(wù)器并實(shí)現(xiàn)公網(wǎng)訪問(wèn)本地Server的步驟
前言
Node.js 是能夠在服務(wù)器端運(yùn)行 JavaScript 的開(kāi)放源代碼、跨平臺(tái)運(yùn)行環(huán)境。Node.js 由 OpenJS Foundation(原為 Node.js Foundation,已與 JS Foundation 合并)持有和維護(hù),亦為 Linux 基金會(huì)的項(xiàng)目。Node.js 采用 Google 開(kāi)發(fā)的 V8 運(yùn)行代碼,使用事件驅(qū)動(dòng)、非阻塞和異步輸入輸出模型等技術(shù)來(lái)提高性能,可優(yōu)化應(yīng)用程序的傳輸量和規(guī)模。這些技術(shù)通常用于資料密集的即時(shí)應(yīng)用程序。
Node.js 大部分基本模塊都用 JavaScript 語(yǔ)言編寫。在 Node.js 出現(xiàn)之前,JavaScript 通常作為客戶端程序設(shè)計(jì)語(yǔ)言使用,以JavaScript 寫出的程序常在用戶的瀏覽器上運(yùn)行。Node.js 的出現(xiàn)使 JavaScript 也能用于服務(wù)端編程。Node.js 含有一系列內(nèi)置模塊,使得程序可以脫離 Apache HTTP Server 或 IIS,作為獨(dú)立服務(wù)器運(yùn),下面將介紹如何簡(jiǎn)單幾步實(shí)現(xiàn)遠(yuǎn)程公共網(wǎng)絡(luò)下訪問(wèn)windwos node.js的服務(wù)端。
1.安裝Node.js環(huán)境
官網(wǎng)下載node.js,我們選擇64位一鍵安裝
安裝好后我們打開(kāi)cmd,輸入命令有正常出來(lái)版本號(hào),表示安裝成功,一鍵安裝版,默認(rèn)會(huì)配置環(huán)境變量。
node -v
2.創(chuàng)建node.js服務(wù)
這里我們?cè)诒镜貏?chuàng)建一個(gè)簡(jiǎn)單的nodejs服務(wù),創(chuàng)建一個(gè)貪吃蛇頁(yè)面小游戲來(lái)進(jìn)行演示。
首先在本地創(chuàng)建一個(gè)文件夾,并在文件夾中新建2個(gè)文件,一個(gè)是js
文件和一個(gè)html
文件,需要放在同個(gè)目錄下,然后使用vscode打開(kāi)。
game.html文件
nodetest.js文件
在game.html
添加如下html
代碼并保存,以下代碼是一個(gè)html頁(yè)面小游戲(貪吃蛇)
<!DOCTYPE html> <html> <head> <title>貪吃蛇</title> <meta charset="UTF-8"> <meta name="keywords" content="貪吃蛇"> <meta name="Description" content="這是一個(gè)初學(xué)者用來(lái)學(xué)習(xí)的小游戲"> <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 =[];//定義一條蛇,畫(huà)蛇的身體 var snakeCount = 6;//初始化蛇的長(zhǎng)度 var foodx =0; var foody =0; var togo =0; function drawtable()//畫(huà)地圖的函數(shù) { for(var i=0;i<60;i++)//畫(huà)豎線 { 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++)//畫(huà)橫線 { 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++)//畫(huà)蛇的身體 { ctx.fillStyle="#000"; if (k==snakeCount-1) { ctx.fillStyle="red";//蛇頭的顏色與身體區(qū)分開(kāi) } ctx.fillRect(snake[k].x,snake[k].y,15,15);//前兩個(gè)數(shù)是矩形的起始坐標(biāo),后兩個(gè)數(shù)是矩形的長(zhǎng)寬。 } //繪制食物 ctx.fillStyle ="black"; ctx.fillRect(foodx,foody,15,15); ctx.fill(); } function start()//定義蛇的坐標(biāo) { //var snake =[];//定義一條蛇,畫(huà)蛇的身體 //var snakeCount = 6;//初始化蛇的長(zhǎng)度 for(var k=0;k<snakeCount;k++) { snake[k]={x:k*15,y:0}; } drawtable(); addfood();//在start中調(diào)用添加食物函數(shù) } function addfood() { foodx = Math.floor(Math.random()*60)*15; //隨機(jī)產(chǎn)生一個(gè)0-1之間的數(shù) foody = Math.floor(Math.random()*40)*15; for (var k=0;k<snake;k++) { if (foodx==snake[k].x&&foody==sanke[k].y)//防止產(chǎn)生的隨機(jī)食物落在蛇身上 { 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();//刪除數(shù)組第一個(gè)元素 ctx.clearRect(0,0,900,600);//清除畫(huà)布重新繪制 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()//吃到食物后長(zhǎng)度加1 { if(snake[snakeCount-1].x==foodx&&snake[snakeCount-1].y==foody) { addfood(); snakeCount++; snake.unshift({x:-15,y:-15}); } } //死亡函數(shù) 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()//調(diào)用函數(shù) { start(); setInterval(move,150); drawtable(); } </script> </body> </html>
nodetest.js
文件添加如下js
代碼,以下代碼意思是開(kāi)啟一個(gè)http服務(wù)
,設(shè)置監(jiān)聽(tīng)3000
端口號(hào)
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. 訪問(wèn)node.js 服務(wù)
當(dāng)我們編寫好相關(guān)代碼后,我們開(kāi)始啟動(dòng)服務(wù).在vscode控制臺(tái)輸入命令【注意需要進(jìn)入到相應(yīng)的文件目錄下執(zhí)行命令】
node .\nodetest.js
有正常返回提示服務(wù)在本地3000端口下,我們打開(kāi)瀏覽器,訪問(wèn)http://127.0.0.1:3000/,出現(xiàn)貪吃蛇界面表示成功【游戲控制:鍵盤上下左右鍵】
4.內(nèi)網(wǎng)穿透
這里我們使用cpolar來(lái)進(jìn)行內(nèi)網(wǎng)穿透,支持http/https/tcp協(xié)議,不限制流量,無(wú)需公網(wǎng)IP,也不用設(shè)置路由器,使用簡(jiǎn)單。
4.1 安裝配置cpolar內(nèi)網(wǎng)穿透
cpolar官網(wǎng):https://www.cpolar.com/
訪問(wèn)cpolar官網(wǎng),注冊(cè)一個(gè)賬號(hào),然后下載并安裝客戶端,具體安裝教程可以參考官網(wǎng)文檔教程。
- windows系統(tǒng):在官網(wǎng)下載安裝包后,雙擊安裝包一路默認(rèn)安裝即可。
- linux系統(tǒng):支持一鍵自動(dòng)安裝腳本,詳細(xì)請(qǐng)參考官網(wǎng)文檔——入門指南
4.2 創(chuàng)建隧道映射本地端口
cpolar安裝成功后,在瀏覽器上訪問(wèn)本地9200端口http://localhost:9200,使用cpolar郵箱賬號(hào)登錄。
點(diǎn)擊左側(cè)儀表盤的隧道管理——創(chuàng)建隧道,創(chuàng)建一個(gè)指向本地3000端口的http隧道
- 隧道名稱:可自定義命名,注意不要與已有的隧道名稱重復(fù)
- 協(xié)議:選擇http
- 本地地址:3000
- 域名類型:免費(fèi)選擇隨機(jī)域名
- 地區(qū):選擇China vip
點(diǎn)擊創(chuàng)建
隧道創(chuàng)建成功后,點(diǎn)擊左側(cè)的狀態(tài)——在線隧道列表,查看所生成的公網(wǎng)地址,然后復(fù)制地址
打開(kāi)瀏覽器器,我們使用上面公網(wǎng)地址進(jìn)行訪問(wèn),至此,我們成功將本地·node.js
服務(wù)發(fā)布到了公網(wǎng)地址
5.固定公網(wǎng)地址
由于以上使用cpolar所創(chuàng)建的隧道使用的是隨機(jī)公網(wǎng)地址,24小時(shí)內(nèi)會(huì)隨機(jī)變化,不利于長(zhǎng)期遠(yuǎn)程訪問(wèn)。因此我們可以為其配置二級(jí)子域名,該地址為固定地址,不會(huì)隨機(jī)變化。
- 保留一個(gè)二級(jí)子域名
登錄cpolar官網(wǎng),點(diǎn)擊左側(cè)的預(yù)留,選擇保留二級(jí)子域名,設(shè)置一個(gè)二級(jí)子域名名稱,點(diǎn)擊保留,保留成功后復(fù)制保留的二級(jí)子域名名稱
保留成功后復(fù)制保留的二級(jí)子域名地址
配置二級(jí)子域名
訪問(wèn)http://127.0.0.1:9200/,登錄cpolar web UI管理界面,點(diǎn)擊左側(cè)儀表盤的隧道管理——隧道列表,找到所要配置的3000隧道,點(diǎn)擊右側(cè)的編輯
修改隧道信息,將保留成功的二級(jí)子域名配置到隧道中
- 域名類型:選擇二級(jí)子域名
- Sub Domain:填寫保留成功的二級(jí)子域名
點(diǎn)擊更新
更新完成后,打開(kāi)在線隧道列表,此時(shí)可以看到公網(wǎng)地址已經(jīng)發(fā)生變化,地址名稱也變成了保留過(guò)的二級(jí)子域名名稱,將其復(fù)制下來(lái)
然后使用固定http地址打開(kāi)瀏覽器訪問(wèn)
訪問(wèn)成功,現(xiàn)在這個(gè)公網(wǎng)地址是固定的了,不會(huì)隨機(jī)變化。成功通過(guò)cpolar內(nèi)網(wǎng)穿透,實(shí)現(xiàn)在外遠(yuǎn)程訪問(wèn)nodejs服務(wù),無(wú)需公網(wǎng)IP ,也不用設(shè)置路由器。
到此這篇關(guān)于如何使用Node.js快速創(chuàng)建HTTP服務(wù)器并實(shí)現(xiàn)公網(wǎng)訪問(wèn)本地Server的文章就介紹到這了,更多相關(guān)Node.js公網(wǎng)訪問(wèn)本地Server內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何在node.js中使用?JsonWebToken模塊進(jìn)行token加密
目前在web框架中最流行的身份驗(yàn)證是使用jsonwebtoken,簡(jiǎn)稱jwt.可以設(shè)置加密方式,過(guò)期時(shí)間,存放個(gè)人信息,逆解析,下面這篇文章主要給大家介紹了關(guān)于如何在node.js中使用?JsonWebToken模塊進(jìn)行token加密的相關(guān)資料,需要的朋友可以參考下2023-03-03Node.js 獲取微信JS-SDK CONFIG的方法示例
這篇文章主要介紹了Node.js 獲取微信JS-SDK CONFIG的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05詳解NodeJS框架express的路徑映射(路由)功能及控制
這篇文章主要介紹了詳解NodeJS框架express的路徑映射(路由)功能及控制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03nodejs 實(shí)現(xiàn)MQTT協(xié)議的服務(wù)器端和客戶端的雙向交互的過(guò)程
這篇文章主要介紹了nodejs 實(shí)現(xiàn)MQTT協(xié)議的服務(wù)器端和客戶端的雙向交互的過(guò)程,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11安裝 node-Sass 報(bào)錯(cuò)的解決記錄(三步解決法)
本文主要介紹了安裝 node-Sass 報(bào)錯(cuò)的解決記錄(三步解決法),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05NodeJS前端自動(dòng)化部署實(shí)現(xiàn)實(shí)例詳解
這篇文章主要為大家介紹了NodeJS前端自動(dòng)化部署實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10