最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Node.js創(chuàng)建本地HTTP服務(wù)器并實(shí)現(xiàn)異地遠(yuǎn)程訪問的方法

 更新時間:2024年01月03日 10:35:59   作者:qiuqiushuibx  
Node.js 是能夠在服務(wù)器端運(yùn)行 JavaScript 的開放源代碼、跨平臺運(yùn)行環(huán)境,這篇文章主要介紹了如何使用Node.js快速創(chuàng)建本地HTTP服務(wù)器并實(shí)現(xiàn)異地遠(yuǎn)程訪問,需要的朋友可以參考下

前言

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

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

1.安裝Node.js環(huán)境

官網(wǎng)下載node.js,我們選擇64位一鍵安裝

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

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

node -v

2.創(chuàng)建node.js服務(wù)

這里我們在本地創(chuàng)建一個簡單的nodejs服務(wù),創(chuàng)建一個貪吃蛇頁面小游戲來進(jìn)行演示。

首先在本地創(chuàng)建一個文件夾,并在文件夾中新建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="這是一個初學(xué)者用來學(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 =[];//定義一條蛇,畫蛇的身體
    var snakeCount = 6;//初始化蛇的長度
	var foodx =0;
	var foody =0;
    var togo =0;
    function drawtable()//畫地圖的函數(shù)
    {
    	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";//蛇頭的顏色與身體區(qū)分開
			}
			ctx.fillRect(snake[k].x,snake[k].y,15,15);//前兩個數(shù)是矩形的起始坐標(biāo),后兩個數(shù)是矩形的長寬。
			}
			//繪制食物	
    		ctx.fillStyle ="black";
	     ctx.fillRect(foodx,foody,15,15);
	     ctx.fill();
    }
    function start()//定義蛇的坐標(biāo)
    {
    	//var snake =[];//定義一條蛇,畫蛇的身體
        //var snakeCount = 6;//初始化蛇的長度
		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)生一個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ù)組第一個元素
   	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});
   }
   }
   //死亡函數(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代碼,以下代碼意思是開啟一個http服務(wù),設(shè)置監(jiān)聽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 服務(wù)

當(dāng)我們編寫好相關(guān)代碼后,我們開始啟動服務(wù).在vscode控制臺輸入命令【注意需要進(jìn)入到相應(yīng)的文件目錄下執(zhí)行命令】

node .\nodetest.js

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

4.內(nèi)網(wǎng)穿透

這里我們使用cpolar來進(jìn)行內(nèi)網(wǎng)穿透,支持http/https/tcp協(xié)議,不限制流量,無需公網(wǎng)IP,也不用設(shè)置路由器,使用簡單。

4.1 安裝配置cpolar內(nèi)網(wǎng)穿透

cpolar官網(wǎng):https://www.cpolar.com/

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

  • windows系統(tǒng):在官網(wǎng)下載安裝包后,雙擊安裝包一路默認(rèn)安裝即可。
  • linux系統(tǒng):支持一鍵自動安裝腳本,詳細(xì)請參考官網(wǎng)文檔——入門指南

4.2 創(chuàng)建隧道映射本地端口

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

點(diǎn)擊左側(cè)儀表盤的隧道管理——創(chuàng)建隧道,創(chuàng)建一個指向本地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ù)制地址

打開瀏覽器器,我們使用上面公網(wǎng)地址進(jìn)行訪問,至此,我們成功將本地·node.js 服務(wù)發(fā)布到了公網(wǎng)地址

5.固定公網(wǎng)地址

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

保留一個二級子域名

登錄cpolar官網(wǎng),點(diǎn)擊左側(cè)的預(yù)留,選擇保留二級子域名,設(shè)置一個二級子域名名稱,點(diǎn)擊保留,保留成功后復(fù)制保留的二級子域名名稱

保留成功后復(fù)制保留的二級子域名地址

配置二級子域名

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

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

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

點(diǎn)擊更新

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

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

訪問成功,現(xiàn)在這個公網(wǎng)地址是固定的了,不會隨機(jī)變化。成功通過cpolar內(nèi)網(wǎng)穿透,實(shí)現(xiàn)在外遠(yuǎn)程訪問nodejs服務(wù),無需公網(wǎng)IP ,也不用設(shè)置路由器。

到此這篇關(guān)于如何使用Node.js快速創(chuàng)建本地HTTP服務(wù)器并實(shí)現(xiàn)異地遠(yuǎn)程訪問的文章就介紹到這了,更多相關(guān)node.js創(chuàng)建本地HTTP服務(wù)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • node.js下LDAP查詢實(shí)例分享

    node.js下LDAP查詢實(shí)例分享

    這篇文章主要介紹了node.js下LDAP查詢實(shí)例分享的相關(guān)資料,需要的朋友可以參考下
    2015-09-09
  • node.js中的fs.lchownSync方法使用說明

    node.js中的fs.lchownSync方法使用說明

    這篇文章主要介紹了node.js中的fs.lchownSync方法使用說明,本文介紹了fs.lchownSync的方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 如何在Nodejs中使用模塊fs文件系統(tǒng)

    如何在Nodejs中使用模塊fs文件系統(tǒng)

    這篇文章主要介紹了如何在Nodejs中使用模塊fs文件系統(tǒng),對nodejs感興趣的同學(xué),可以參考下
    2021-05-05
  • Express實(shí)現(xiàn)定時發(fā)送郵件的示例代碼

    Express實(shí)現(xiàn)定時發(fā)送郵件的示例代碼

    在開發(fā)中我們有時候需要每隔?一段時間發(fā)送一次電子郵件,或者在某個特定的時間進(jìn)行發(fā)送郵件,無需手動去操作,基于這樣的情況下我們需要用到了定時任務(wù)。本文就來用Express實(shí)現(xiàn)定時發(fā)送郵件吧
    2023-04-04
  • 通過NodeJS輕松使用GRPC和協(xié)議緩沖區(qū)的方法

    通過NodeJS輕松使用GRPC和協(xié)議緩沖區(qū)的方法

    本文介紹了GRPC和協(xié)議緩沖區(qū)的基本概念,并展示了如何在NodeJS應(yīng)用程序中使用它們,GRPC是一個高性能RPC框架,協(xié)議緩沖區(qū)則用于定義服務(wù)和序列化消息,本文給大家介紹如何在NodeJS應(yīng)用程序中使用GRPC和協(xié)議緩沖區(qū),感興趣的朋友一起看看吧
    2024-10-10
  • Node.js應(yīng)用設(shè)置安全的沙箱環(huán)境

    Node.js應(yīng)用設(shè)置安全的沙箱環(huán)境

    這篇文章主要介紹了Node.js應(yīng)用設(shè)置安全的沙箱環(huán)境的方法以及注意事項(xiàng),對此有需要的朋友可以參考學(xué)習(xí)下。
    2018-04-04
  • nodejs報(bào)digital?envelope?routines::unsupported錯誤的最新解決方法

    nodejs報(bào)digital?envelope?routines::unsupported錯誤的最新解決方法

    這篇文章主要介紹了nodejs報(bào)digital?envelope?routines::unsupported錯誤的最新解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • 使用Node.js搭建Vue項(xiàng)目的詳細(xì)步驟

    使用Node.js搭建Vue項(xiàng)目的詳細(xì)步驟

    Vue.js 是一款流行的 JavaScript 框架,而 Node.js 提供了一個強(qiáng)大的運(yùn)行環(huán)境,兩者的結(jié)合使得開發(fā)者可以輕松構(gòu)建現(xiàn)代化的前端項(xiàng)目,本文將介紹如何使用 Node.js 搭建一個基本的 Vue 項(xiàng)目,需要的朋友可以參考下
    2023-12-12
  • nodejs轉(zhuǎn)換音頻文件格式并壓縮導(dǎo)出zip格式(vscode語音插件開發(fā))

    nodejs轉(zhuǎn)換音頻文件格式并壓縮導(dǎo)出zip格式(vscode語音插件開發(fā))

    FFmpeg是一套開源的音視頻處理工具,通俗地講,可以對音視頻文件進(jìn)行剪切、拼接、水印、轉(zhuǎn)碼等處理,這篇文章主要介紹了nodejs轉(zhuǎn)換音頻文件格式并壓縮導(dǎo)出zip格式(vscode語音插件開發(fā)),需要的朋友可以參考下
    2023-05-05
  • Node.js下自定義錯誤類型詳解

    Node.js下自定義錯誤類型詳解

    在JavaScript里面,運(yùn)行過程中的錯誤的類型總是被人忽略,這篇文章給大家詳細(xì)介紹了如何在Node.js下自定義錯誤類型,對大家學(xué)習(xí)或者使用Node.js具有一定的參考借鑒價值,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-10-10

最新評論

龙南县| 佛学| 五莲县| 绥中县| 梁山县| 社会| 盖州市| 乐昌市| 金堂县| 时尚| 平南县| 公主岭市| 沽源县| 加查县| 武穴市| 手游| 淮南市| 吉木乃县| 封丘县| 温泉县| 泗水县| 吉安市| 枞阳县| 沙洋县| 湘阴县| 乌审旗| 隆昌县| 高碑店市| 正镶白旗| 阜新市| 遂昌县| 洪江市| 紫金县| 阿拉善左旗| 五寨县| 磐石市| 犍为县| 万载县| 昆山市| 扎赉特旗| 炎陵县|